我直接进入问题,目前我有一张桌子
id | model | CategoryId | etc...
现在我的新要求是支持多个类别。所以我有两个可能的解决方案,但我想知道这个设计可能会产生的问题。我也知道最多我可以有6个类别,我也无法创建链接表来将产品链接到类别。
在第一次设计时,我只想创建ColumnN
列id | model | CategoryId1 | CategoryId2 | CategoryId3 | CategoryId4 | etc...
但这会使查询变得丑陋,
id | model | CategoryId | etc...
我的第二种方法只是添加N类产品
id | model | CategoryId | etc...
1 | ABC | 1 | etc...
2 | ABC | 2 | etc...
3 | ABC | 3 | etc...
我认为查询会更清晰但不一定更简单。 另一个方面是我正在查看查询的性能,看起来第一种方法会更好。 我希望这很清楚。
感谢您的任何建议。
答案 0 :(得分:4)
第三个选项是将模型链接到类别的多对多表:
MODEL
表的外键)CATEGORY
表的外键)您的示例数据类似于:
model_id category_id
----------------------
1 1
1 2
1 3
这意味着MODEL表中不需要category_id列。
答案 1 :(得分:1)
我认为你在这里many-to-many relationship之后。
基本上,您有一个model_to_categories表,它将模型ID与类别ID匹配。
答案 2 :(得分:0)
您可以将CategoryID值设为位字段“flags”吗?
如果是这样,您可以使用现在拥有的单个CategoryID字段来保持高性能,通过不添加一堆新列来保持查询简单,并且每个产品随着时间的推移最多可以包含32个类别(假设CategoryID是一个int)。
因此,您的CategoryID值将是:
id | model | CategoryId | etc...
1 | ABC | 1 | etc...
2 | ABC | 2 | etc...
3 | ABC | 4 | etc...
3 | ABC | 8 | etc...
您可以将所有CategoryID的总数存储在CategoryID列中(为了向后兼容),然后必须测试该字段的值以查明特定类别是否“已设置”。顺便提一下,您也可以直接在查询中执行此操作。
这不是“最佳实践”,这真的需要一个全新的表格和大量的加入,但是如果你正在寻找一种方法来制作一些可以工作的东西,那么比特场标志会做诀窍。