基础数据库设计。使用另一个表或列

时间:2010-01-21 19:46:58

标签: sql-server foreign-keys one-to-many

我有一个表格,其中包含有关特定对象的信息,说项目并且有列

ItemID,ItemName,price, ItemListingType ..... LastOrderDate

其中一项信息 ItemListingType 可能是10种不同类型之一 如:

私人,政府,非政府,商业......等(字符串),未来可以扩展到更多类型。

我是否应该使用表 ITEM 中的列,还是应该使用具有两列的单独表并将外键放在Item表中以引用该列(一对多关系)?像:

  • ListingTypeID int

  • ListingTypeName varchar(MAX)

编辑:列的值有多少,您可以考虑使用另一个表

  

2,4或什么?

由于

6 个答案:

答案 0 :(得分:8)

使用单独的表来存储此类参考数据。这是规范化的原则,并且还可以实现更轻松的缓存,因为您将只读和读写数据分开。我的两分钱......

答案 1 :(得分:3)

单独的表。

  • 如果您的商品目录尚未使用,该怎么办?
  • 或删除类型为x?
  • 的最后一项
  • 或者需要更改值?

这些是insert, update and delete anomalies,这是标准化的一个原因

答案 2 :(得分:2)

我肯定会选择“查找”样式列;这样,当未来添加到允许的列表类型列表时,您就不会感到难过。您还可以减少冗余并更容易更改特定类型的列表(如果“gov”更改为“政府机构”,那么您只需在一个地方更改它)。

答案 3 :(得分:2)

您应该使用包含ListingTypes的第二个表并使用Objects对象链接到该表的id ...

查看Relational DatabaseRelational model

答案 4 :(得分:1)

在这样的情况下,我问自己: 该项可以具有未确定数量的列表类型吗?如果是,请使用不同的表格。

规格是否说永远不会超过3种?要看。有时候,我仍会选择单独的桌子,有时候不会。一段时间后你会对此感到满意。

项目是否总是有一个列表类型?如果是,则表,单列。


现在更进一步。 如果一个Item有零个或多个列表类型并且这些列表类型实际上是共享的(换句话说,两个项可以具有相同的列表类型,那么我们有3个表:Items,ListingTypes和一个交叉引用表来支持多对多关系。

答案 5 :(得分:0)

很明显,你应该使用一个额外的表,因为你不会有这样的重复。它还允许您在一个位置更改此列表的值。但是,如果您非常确定不会添加任何类型,请保留该列。