Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 数据库设计,用于优化访问_Sql - Fatal编程技术网

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

Sql 数据库设计,用于优化访问,sql,Sql,我直接进入问题,目前我有一张这样的表格 id | model | CategoryId | etc... 现在我的新要求是支持多个类别。所以我有两种可能的解决方案,但我想知道这两种设计可能会产生的问题。我还知道我最多可以有6个类别,而且我不能创建链接器表来将产品链接到类别 在第一个设计中,我只需创建列CategoryN id | model | CategoryId1 | CategoryId2 | CategoryId3 | CategoryId4 | etc... 但这会让质疑变得可怕

我直接进入问题,目前我有一张这样的表格

id | model | CategoryId | etc...
现在我的新要求是支持多个类别。所以我有两种可能的解决方案,但我想知道这两种设计可能会产生的问题。我还知道我最多可以有6个类别,而且我不能创建链接器表来将产品链接到类别

在第一个设计中,我只需创建列CategoryN

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...
我认为查询会更简洁,但不一定更简单。 另一个方面是,我正在研究查询的性能,第一种方法似乎会更好。 我希望这足够清楚


感谢您的建议。

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

模型类别
  • 型号id(主键,外键到
    model
    表)
  • 类别id(主键,类别的外键表)
您的示例数据类似于:

model_id  category_id
----------------------
1         1
1         2
1         3

这意味着模型表中不需要类别id列。

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

模型类别
  • 型号id(主键,外键到
    model
    表)
  • 类别id(主键,类别的外键表)
您的示例数据类似于:

model_id  category_id
----------------------
1         1
1         2
1         3
这意味着模型表中不需要category_id列。

我想您需要的是一个

基本上,您有一个model\u to\u categories表,该表将model id与category id进行匹配。

我想您需要的是一个


基本上,您有一个model_to_categories表,它将model id与category id进行匹配。

您能将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的总数(为了向后兼容),然后必须测试字段的值,以确定是否“设置”了特定类别。顺便说一句,您也可以在查询中直接这样做


这不是“最佳实践”,它确实需要一个全新的表和大量的加入,但如果您正在寻找一种方法,使其中的某些内容起作用,则位字段标志将起作用。

您能将CategoryID值位字段设为“标志”吗

如果是这样,您可以通过使用现有的单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的总数(为了向后兼容),然后必须测试字段的值,以确定是否“设置”了特定类别。顺便说一句,您也可以在查询中直接这样做


这不是“最佳实践”,它需要一个全新的表和大量的加入,但如果您正在寻找一种方法,使其中的某些内容起作用,则位字段标志将起作用。

我忘了说categoryid是Guid,所以我真的不能使用这种方法。如果你想查询它的话,它是如何工作的?我忘了说categoryid是一个Guid,所以我真的不能使用这种方法。如果您想查询它,这将如何工作?我希望使用这种方法,但我不能向数据库添加任何新表。我想我的问题本来就是这样的。谢谢。@Greg:当然可以。和DBA(角落里那个沉默寡言的家伙)谈谈。他和你一样渴望创建一些有用的东西。我很想使用这种方法,但我不能向数据库中添加任何新表。我想我的问题本来就是这样的。谢谢。@Greg:当然可以。和DBA(角落里那个沉默寡言的家伙)谈谈。他和你一样渴望创造一些有用的东西。