Table of Contents
回复内容:
Home Backend Development PHP Tutorial 请问关于商品标签的数据库设计及多层关联逻辑?

请问关于商品标签的数据库设计及多层关联逻辑?

Jun 06, 2016 pm 08:16 PM
mysql php Architecture design

普通的一个商品对应多个标签的设计只需要3个表(商品表、标签表、关联表)就能解决,我这个情况有些复杂,烦请各位知友帮我出出主意

简单介绍下背景,项目是一个第三方展览平台,就是本身不做展览,但负责联通展品、参展人、品牌方、展馆、展览会的这么一个平台,类似中介这样的。参展人或品牌方可以在上面提交自己的展品;有空余场地的人也可以在上面出租自己的场地作为展馆;然后就凑在一起举办展览会。也许我这么说有些莫名其妙,大家不要在意,有协议在身我也不好再细说下去了。

按照目前的需求,上传展品时允许自定义标签,不限数量。参展人和品牌方本身不带标签功能,而是通过“参展人(品牌方)-展品-标签”的方式关联,也就是说参展人的标签取决于他上传的所有展品的标签,品牌方同理。
而展览会本身也不带标签功能,通过“展览会-参展人-展品-标签”的方式关联。展览会有开始时间和结束时间两个字段,超过结束时间则视为展览结束。

问题来了,需求是在展览会列表中,根据标签筛选;而且未参展的标签不显示。

我顿时就懵逼了,按照这个需求,我得先找出所有正在展出的展览会(即已开始且未结束)的参展人或品牌方,然后查出他们所有的展品,然后查出这些展品所有的标签, 然后去除重复的,最后显示。这在未来数据量大了之后将会多么恐怖

我不知道是这个需求本身就不合理,还是说其实有很好的解决办法但我想不到。请各位知友不吝赐教

补充一下,由于对方的一些限制,无法使用诸如redi、memcache、mongodb之类的,只能用mysql

回复内容:

普通的一个商品对应多个标签的设计只需要3个表(商品表、标签表、关联表)就能解决,我这个情况有些复杂,烦请各位知友帮我出出主意

简单介绍下背景,项目是一个第三方展览平台,就是本身不做展览,但负责联通展品、参展人、品牌方、展馆、展览会的这么一个平台,类似中介这样的。参展人或品牌方可以在上面提交自己的展品;有空余场地的人也可以在上面出租自己的场地作为展馆;然后就凑在一起举办展览会。也许我这么说有些莫名其妙,大家不要在意,有协议在身我也不好再细说下去了。

按照目前的需求,上传展品时允许自定义标签,不限数量。参展人和品牌方本身不带标签功能,而是通过“参展人(品牌方)-展品-标签”的方式关联,也就是说参展人的标签取决于他上传的所有展品的标签,品牌方同理。
而展览会本身也不带标签功能,通过“展览会-参展人-展品-标签”的方式关联。展览会有开始时间和结束时间两个字段,超过结束时间则视为展览结束。

问题来了,需求是在展览会列表中,根据标签筛选;而且未参展的标签不显示。

我顿时就懵逼了,按照这个需求,我得先找出所有正在展出的展览会(即已开始且未结束)的参展人或品牌方,然后查出他们所有的展品,然后查出这些展品所有的标签, 然后去除重复的,最后显示。这在未来数据量大了之后将会多么恐怖

我不知道是这个需求本身就不合理,还是说其实有很好的解决办法但我想不到。请各位知友不吝赐教

补充一下,由于对方的一些限制,无法使用诸如redi、memcache、mongodb之类的,只能用mysql

这样的需求用关系数据库实现再合适不过了。
根据你的描述,参见如下数据模型:
请问关于商品标签的数据库设计及多层关联逻辑?

根据Tag查询Exhibition:

<code>SELECT e.GalleryId, e.StartTime, e.EndTime
FROM Exhibition e
WHERE EXISTS (
    SELECT 1
    FROM PresentedProduct p
    JOIN ProductTag pt ON pt.ProductId = p.ProductId
    WHERE TagId = 'T1' AND p.GalleryId = e.GalleryId AND p.StartTime = e.StartTime
    )</code>
Copy after login

我对具体需求不太了解,所以你需要根据具体情况设计数据模型。
在逻辑设计的阶段,不要考虑物理实现,数据量等问题,而是要忠于需求,设计出符合逻辑的逻辑数据模型。
在物理实现时,根据需求建索引,甚至分表,等等。
不要过早优化。

以下是个人观点:

  1. 慎用人工Id (Surrogate Key)
    如果每个表都用一个人工Id,很难分析出符合逻辑的数据模型,数据完整性也得不到保证,而且一个查询往往需要很多JOIN。

  2. 数据量
    关系数据库的处理能力是很强的,对于几百万级别的表,只要索引设好了,返回相对少量的数据是很快的。如果需要返回的数据量也大,那你不管怎么设计都需要花费很多时间。不要把你的项目想象成google或者亚马逊,那样的话大部分团队根本没时间,也没能力开发出来。即使项目真的很成功,到时再重构也来得及。把经典的关系数据库学好了,足够应付大部分项目。

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Best Graphic Settings
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. How to Fix Audio if You Can't Hear Anyone
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: How To Unlock Everything In MyRise
4 weeks ago By 尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

MySQL: The Ease of Data Management for Beginners MySQL: The Ease of Data Management for Beginners Apr 09, 2025 am 12:07 AM

MySQL is suitable for beginners because it is simple to install, powerful and easy to manage data. 1. Simple installation and configuration, suitable for a variety of operating systems. 2. Support basic operations such as creating databases and tables, inserting, querying, updating and deleting data. 3. Provide advanced functions such as JOIN operations and subqueries. 4. Performance can be improved through indexing, query optimization and table partitioning. 5. Support backup, recovery and security measures to ensure data security and consistency.

Can I retrieve the database password in Navicat? Can I retrieve the database password in Navicat? Apr 08, 2025 pm 09:51 PM

Navicat itself does not store the database password, and can only retrieve the encrypted password. Solution: 1. Check the password manager; 2. Check Navicat's "Remember Password" function; 3. Reset the database password; 4. Contact the database administrator.

How to create navicat premium How to create navicat premium Apr 09, 2025 am 07:09 AM

Create a database using Navicat Premium: Connect to the database server and enter the connection parameters. Right-click on the server and select Create Database. Enter the name of the new database and the specified character set and collation. Connect to the new database and create the table in the Object Browser. Right-click on the table and select Insert Data to insert the data.

How to view database password in Navicat for MariaDB? How to view database password in Navicat for MariaDB? Apr 08, 2025 pm 09:18 PM

Navicat for MariaDB cannot view the database password directly because the password is stored in encrypted form. To ensure the database security, there are three ways to reset your password: reset your password through Navicat and set a complex password. View the configuration file (not recommended, high risk). Use system command line tools (not recommended, you need to be proficient in command line tools).

Navicat cannot connect to MySQL/MariaDB/PostgreSQL and other databases Navicat cannot connect to MySQL/MariaDB/PostgreSQL and other databases Apr 08, 2025 pm 11:00 PM

Common reasons why Navicat cannot connect to the database and its solutions: 1. Check the server's running status; 2. Check the connection information; 3. Adjust the firewall settings; 4. Configure remote access; 5. Troubleshoot network problems; 6. Check permissions; 7. Ensure version compatibility; 8. Troubleshoot other possibilities.

Navicat connects to database error code and solution Navicat connects to database error code and solution Apr 08, 2025 pm 11:06 PM

Common errors and solutions when connecting to databases: Username or password (Error 1045) Firewall blocks connection (Error 2003) Connection timeout (Error 10060) Unable to use socket connection (Error 1042) SSL connection error (Error 10055) Too many connection attempts result in the host being blocked (Error 1129) Database does not exist (Error 1049) No permission to connect to database (Error 1000)

How to create a new connection to mysql in navicat How to create a new connection to mysql in navicat Apr 09, 2025 am 07:21 AM

You can create a new MySQL connection in Navicat by following the steps: Open the application and select New Connection (Ctrl N). Select "MySQL" as the connection type. Enter the hostname/IP address, port, username, and password. (Optional) Configure advanced options. Save the connection and enter the connection name.

How to connect to local mysql in navicat How to connect to local mysql in navicat Apr 09, 2025 am 07:45 AM

To connect to a local MySQL database using Navicat: Create a connection and set the connection name, host, port, username, and password. Test the connection to make sure the parameters are correct. Save the connection. Select a new connection from the connection list. Double-click the database you want to connect to.

See all articles