数据库设计,用于优化访问

时间:2010-12-14 06:02:38

标签: sql

我直接进入问题,目前我有一张桌子

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...

我认为查询会更清晰但不一定更简单。 另一个方面是我正在查看查询的性能,看起来第一种方法会更好。 我希望这很清楚。

感谢您的任何建议。

3 个答案:

答案 0 :(得分:4)

第三个选项是将模型链接到类别的多对多表:

MODEL_CATEGORIES

  • model_id(主键,MODEL表的外键)
  • category_id(主键,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是一个i​​nt)。

因此,您的CategoryID值将是:

   id | model | CategoryId | etc...
   1 | ABC   | 1           | etc...
   2 | ABC   | 2           | etc...
   3 | ABC   | 4           | etc...
   3 | ABC   | 8           | etc...

您可以将所有CategoryID的总数存储在CategoryID列中(为了向后兼容),然后必须测试该字段的值以查明特定类别是否“已设置”。顺便提一下,您也可以直接在查询中执行此操作。

这不是“最佳实践”,这真的需要一个全新的表格和大量的加入,但是如果你正在寻找一种方法来制作一些可以工作的东西,那么比特场标志会做诀窍。