【发布时间】:2013-07-04 07:45:11
【问题描述】:
我已经尝试了两种方法,但随着输入量的增加,我无法确定哪一种通常会做得更好。
首先是背景故事:
我们有产品,每个产品都有一个类别路径(例如配饰-鞋-运动鞋)
我想将我的产品与其各自的类别联系起来,同时保持符合 3NF 规则的内容。
我可以通过这两种方式,我可以:
-
产品和类别之间具有多对多关系(通过将类别路径分解为单个类别并在多对多表中形成关联)
优点:
简单易懂。缺点:
多对多关联呈指数增长!你可以想象为什么,每个产品都有多个类别,而测试用例只涉及 250,000 个产品。我可以直观地看到,随着输入大小的增加,数据库引擎的压力也会增加。 -
在类别路径和产品之间创建多对多关系,在类别路径和实际类别之间创建另一个多对多关系。这对我来说很有意义,因为 250,000 个产品的测试用例中的类别路径被限制为 13,000 个唯一实例,并且这些路径与它们在另一个多对多关系中的实际类别相关联的行不超过 61,000 行。
优点:
数据库快速处理的类别关联要少得多(61,000 个关联,而第一种技术形成的关联为 900,000 个)缺点:
更多的内部连接。产品与类别路径相关联,而类别路径又与多对多关系中的类别相关联。
您认为哪种技术更合适?我需要 FAST 检索,因此快速选择语句应该是主要标准。
我意识到这在很大程度上取决于正确的索引,但在第一种情况下,行的大小至少增长了 3 倍,而在第二种情况下,内部连接太多,我担心速度的检索受到负面影响。
【问题讨论】:
标签: mysql sql database performance database-design