SQL:在一个表中存储各种字段的最佳实践

时间:2009-12-02 15:09:38

标签: sql sql-server-2005 database-design

我想为项目设计一个表格。 有许多类型的项目,都共享几个字段。 每种类型的项目都有自己的字段。 我想将不常见的字段存储在单独的表中。 我想到了类似的东西:

----Items
+Item_id
+Item_Type_Id
+Item_Serial
...

----Item_types
+Item_Type_Id
+Item_Name
...

----Item_Fields
+Item_Field_Id
+Item_Type_Id
+Field_Name
...

----Field_Values
+Field_Value_Id
+Item_Field_Id
+Item_Id
+Value
...

专业人员可以在不更改表的情况下添加字段和值。 结果是我必须转置字段名称和值才能查看项目的所有信息。

有什么更好的建议吗?或者也许是一种简单的(非存储过程)方式来加入表来获取平面信息? 我试图使用PIVOT(我正在使用SQL 2005),但没有运气。

感谢。

6 个答案:

答案 0 :(得分:1)

另一个选择是将XML格式的项目存储在一个字段中。根据您的使用情况,它可能会很好。或者它可能没有。

答案 1 :(得分:1)

我认为必须有一些价值观。

例如,假设您的项目是房间中的对象。然后,不同类型的对象具有不同的属性。例如,书籍有出版日期和页数,椅子有颜色图案和高度等。

在此示例中,您可以创建项目表,书籍表和主席表。

您可以制作一个包含上述通用信息的“附加值”表,但您真正想要做的是找出不同属性组的“类型”,然后将这些类型中的每一个都作为自己的表

是否有一组所有项目都有的值?必须至少有一个是类型字段(这描述了存储其他信息的位置。我希望每个项目都有一个名称和描述。这是项目表中的信息。

然后你为不同类型的itembook,itemchair等制作额外的表格。甚至可能会有一些重叠。例如,itembook,itemhardback,itempaperback将是3个用于描述书籍的表。

我相信这是解决您问题的最佳方案。它仍然允许您扩展,但它确实为您的数据设置了一个框架。

当然,有些系统会按照您描述的方式执行,但除非您正在构建其他人要为许多不同项目重用的工具,否则为手头的任务设计系统是有意义的。否则你最终会落入过度设计陷阱。 (IMHO)

另一方面,如果你要走完全通用的方向,我建议你使用已经存在的以这种方式工作的系统之一(实体框架,应用程序框架等)使用别人的不开始从头开始。

答案 2 :(得分:1)

我不太确定你想要如何检索信息,但是下面的内容可能会有效。 (这可能与Hogan提到的很接近。)

  • 如果要检索某个类型的数据,可以只加入两个表。
  • 如果要检索所有类型的数据(包含所有字段),可以LEFT JOIN所有表。

----Items
+Item_id
+Item_Type_Id
+Item_Common_Field1
+Item_Common_Field1
...

----Item_Type_A
+Item_id
+Item_Type_A_Specific_Field1
+Item_Type_A_Specific_Field2
...

----Item_Type_B
+Item_id
+Item_Type_B_Specific_Field1
...

答案 3 :(得分:1)

我编写了一个存储过程来使PIVOT更有用。这是来源:

http://dot-dash-dot.com/files/pivot_query.sql

以及如何使用它的一些例子:

http://dot-dash-dot.com/files/pivot_query_examples.sql

对于您的数据,查询将只是连接上述表格的原始数据,以生成以下原始列表:

set @myQuery = '
 Select Item_Id, Item_Name, Field_Name, Value From ...
';

然后你对pivot_query的调用将是:

exec pivot_query @myQuery, 'Item_Id, Item_Name', 'Field_Name', 'max(Value)'
像那样。

答案 4 :(得分:0)

如果将这些列添加到表中,则可以将它们设置为稀疏列,以避免未指定的非常规字段占用的空间。

但我称之为最佳做法。 (见你问题的评论)

答案 5 :(得分:0)

我不想被指责为永远使用最新无用的技术人员,但根据您的使用情况,这可能是nosql数据库的好例子 - Tokyo,Mongo,SimpleDB或者,正如Developer Art建议的那样,您可以将不同的字段序列化为单个列。这不是世界上最糟糕的事情。