创建字段/值表的正确方法?

时间:2010-09-15 03:13:06

标签: sql sql-server

我需要帮助。我不知道创建我需要的表的正确方法是什么。我可以采用不同的方式,但我可能会以一种愚蠢的方式做到这一点。

以下是我的情况示例。

我有人。 每个人都有领域。

字段可以是:ShirtType,PantType,HairColor,EyeColor,ShoeType,Height,Weight等。 我将来需要添加其他字段。

每个人可能不会使用所有字段。 (有些人只会使用一个字段)。

我应该:

  1. 创建一个包含所有字段作为列的表,并将数据放入我每次需要的数据中?
  2. OR

    1. 创建一个Fields表来保存所有字段名称。然后,创建一个Values表来保存值,由FieldId?
    2. 引用

      第一个似乎不那么令人困惑,但第二个浪费的空间更少。 NULL字段(方法1)是浪费空间吗?糟糕的设计? 我可以轻松地将数据导入第一个方法,但第二个方法我必须添加一个值列表和字段ID,一次一个值列表。可能需要一段时间。

      如果这不是很有道理,我道歉,但我真的可以使用一些建议。

      感谢。

4 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

“类型”字段可以进入两种类型的表中的一种 - 外键表或“查找”表。如果字段只有几个可能的值,我倾向于使用查找表。它们有像lookupType这样的字段,可以是“ShirtType”,“PantType”等,用于选择正确的行。然后有像lookupKey这样的字段(唯一的,像int,“主键”)和lookupValue(所述记录的值,如“T恤”或“长袖”)

单一表格中的记录示例可能是:

lookupType  lookupKey  lookupValue
Gender      1          Male
ShirtType   1          T-Shirt
Gender      2          Female
PantType    1          Shorts
ShirtType   2          Long Sleeve

因此,您对所有性别类型的查询如下所示:

SELECT lookupKey, lookupValue
WHERE lookupType = 'Gender'

答案 2 :(得分:0)

如果你有一个相对较小且可知的“字段”数量 - 也就是说,你不会想到以后需要添加的更多字段 - 那么第一种方式是可以接受的。

但在其他情况下,如果您不知道有多少字段或有大量字段,或者可能添加了新字段,则只需添加另一个表。它提供了适当的关系建模和更容易的可扩展性。

编写一些代码将“平面”记录转换为正确的数据库结构以便重用,然后插入就像在单个表中一样简单。

答案 3 :(得分:0)

如果每个人每个人只有一种类型,那么你可以将它们全部放在一张桌子上。如果一个人有两个或更多相同的(即2个衬衫类型),那么你应该考虑为不同的领域设置一个表,这样你就可以做更好的搜索。

如果您需要2种或更多某种类型的字段,我会举例说明。您还需要表格来告诉您每个值的含义。而你不使用的字段,尚未知道或刚刚添加的字段,可以有0(或NULL,但我更喜欢0):

表: PersonCommonInfo 只放在此处一个人只有一次,并且永远不会有两个或更多

PersonId   Gender   Height   Weight   HairColor   EyeColor   SkinColor
1          M        55       200      1           1          0
2          M        60       220      7           0          0
3          F        50       130      0           4          0

表: PersonToAccessories 此表格包含一个人可以拥有1个或多个字段的任何字段。如果您确定永远不会出现这种情况,可以将其与上一个表合并并节省一些空间。虽然,为了将来做好准备,最好还是这样开始。

PersonAccessoryId   PersonId   AccesoryType   AccesoryValue
1                   1          Shirt          1
2                   2          Shirt          2
3                   2          Shirt          5
4                   2          Pant           1
5                   3          Shirt          2

第2行和第3行显示Person 2有两件衬衫。因此,当您从Person 2查询此表中的所有附件时,您将获得2件衬衫和1件裤子。

正如我所说,你需要另一张表(或xml),你可以比较ShirtType == 1所代表的等等。