搜索
首页后端开发php教程请问关于商品标签的数据库设计及多层关联逻辑?

普通的一个商品对应多个标签的设计只需要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>

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

以下是个人观点:

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

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

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
您如何在PHP中创建和使用接口?您如何在PHP中创建和使用接口?Apr 30, 2025 pm 03:40 PM

本文解释了如何创建,实施和使用PHP中的接口,重点关注其对代码组织和可维护性的好处。

crypt()和password_hash()有什么区别?crypt()和password_hash()有什么区别?Apr 30, 2025 pm 03:39 PM

本文讨论了PHP中的crypt()和password_hash()之间的差异,以进行密码哈希,重点介绍其实施,安全性和对现代Web应用程序的适用性。

如何防止PHP中的跨站点脚本(XSS)?如何防止PHP中的跨站点脚本(XSS)?Apr 30, 2025 pm 03:38 PM

文章讨论了通过输入验证,输出编码以及使用OWASP ESAPI和HTML净化器之类的工具来防止PHP中的跨站点脚本(XSS)。

PHP中的自动加载是什么?PHP中的自动加载是什么?Apr 30, 2025 pm 03:37 PM

自动加载PHP会在需要时自动加载类文件,从而通过减少内存使用和增强代码组织来提高性能。最佳实践包括使用PSR-4和有效组织代码。

什么是PHP流?什么是PHP流?Apr 30, 2025 pm 03:36 PM

PHP流通过一致的API统一处理文件,网络插座和压缩格式等资源的处理,从而提高复杂性并增强代码灵活性和效率。

可以使用PHP上传的文件的最大大小是多少?可以使用PHP上传的文件的最大大小是多少?Apr 30, 2025 pm 03:35 PM

本文讨论了在PHP中管理文件上传大小的管理,重点是2MB的默认限制以及如何通过修改PHP.INI设置来增加它。

PHP中的无效类型是什么?PHP中的无效类型是什么?Apr 30, 2025 pm 03:34 PM

本文讨论了PHP 7.1中引入的PHP中的无效类型,允许变量或参数为指定类型或NULL。它突出显示了诸如提高可读性,类型安全性和明确意图的好处,并解释了如何声明

unset()和unlink()函数之间有什么区别?unset()和unlink()函数之间有什么区别?Apr 30, 2025 pm 03:33 PM

本文讨论了unset()和unlink()功能在编程中的差异,重点关注其目的和用例。 unset()从内存中删除变量,而unlink()从文件系统中删除文件。两者都对效率至关重要

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

功能强大的PHP集成开发环境

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

SecLists

SecLists

SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

将Eclipse与SAP NetWeaver应用服务器集成。

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。