表架构最佳实践

时间:2012-07-06 14:30:22

标签: sql database-design

我有一张桌子,我正在存储我拥有的工具的配置。它有一个ConfigID,它只是一个标识字段,客户名称,应用程序名称,然后它有18个众所周知的字段(wellknownfield1,wellknownfield2,...,wellknownfield18),我知道根据另一个表值放入什么。

现在我的问题出现了。我还需要自定义值。目前我有一个愚蠢的解决方案,有customfieldname1,customfieldvalue1,...,customfieldname20,customfieldvalue20)。其中值具有所有随机值,我需要通过管道分隔。我正在使用SQL Server数据库。有人有什么建议吗?如果有任何不清楚的地方请评论。

3 个答案:

答案 0 :(得分:3)

严格地说,您不应该在一列中添加值组。它违反了第一种正常形式的关系数据。创建一个名为Custom Data(Config_ID,CUSTOM_NAME,CUSTOM_DATA_VALUE,CUSTOM_DATA_TYPE)的单独表,并将自定义值存储在其中。

答案 1 :(得分:0)

使用另一个带外键的表。保存您需要保存的所有customfieldname值。使用ConfigID作为外键来引用具有额外自定义值的主表上的ConfigID。

答案 2 :(得分:0)

有一种标准的方法可以布置数据库表,使其易于管理 - 称为规范化。有不同程度的标准化 - 第一范式,第二范式,第三范式......和更高(在我看来,第三范式以上有点深奥)。

这里对这些定义的解释:

Normalization in plain English

What are 1NF, 2NF and 3NF in database design?

它看起来很抽象 - 但重点是摆脱任何歧义 或者在数据库中重复,并防止问题进一步发生。

正如srini.venigalla指出的那样 - 您的表不符合第一范式的标准 - 每行应具有相同数量的数据,每个数据库列一个。同样,它似乎是一个抽象的规则 - 但它可以防止现实世界的问题 - 比如,我如何解析这个列值?我怎么知道分隔符是什么?如果它没有足够的数据点怎么办?如果有额外的列,它们的名称是什么?如果你坚持每列一个值,所有这些问题都会消失。

对于第二范式和第三范式也是如此 - 它们不允许数据库中的重复值/减少,这可以防止使数据库处于不一致状态的现实问题。

关于数据库的标准化程度存在争议/权衡 - 但是让一切符合第三范式似乎是初学者的可接受的经验法则。

(这是我为自己的非1NF和非2NF数据库模式编写代码解决方法之后的结论)