我有一个表,其中存储了我拥有的工具的配置。它有一个ConfigID,它只是一个身份字段,客户名称,应用程序名称,然后它有18个众所周知的字段(wellknownfield1,wellknownfield2,...,wellknownfield18),我知道根据另一个表值放入什么。
现在我的问题来了。我还需要自定义值。目前我有一个愚蠢的解决方案,有customfieldname1,customfieldvalue1,...,customfieldname20,customfieldvalue20)。其中的值包含我需要用竖线分隔的所有随机值。我正在使用SQL Server数据库。有人有什么建议吗?如果有任何不清楚的地方,请发表意见。
发布于 2012-07-06 22:38:56
严格地说,您不应该将值分组放入一列中。它违反了关系数据的第一种范式。创建一个名为自定义数据(Config_ID、CUSTOM_NAME、CUSTOM_DATA_VALUE、CUSTOM_DATA_TYPE)的单独表,并在其中存储自定义值。
发布于 2012-07-06 22:36:00
使用另一个带有外键的表。保存所有需要保存的customfieldname值。使用ConfigID作为外键来引用具有额外自定义值的主表上的ConfigID。
发布于 2013-07-25 22:06:35
有一种标准的方法来布局数据库表,以使其易于管理-称为标准化。有不同级别的规范化-第一范式,第二范式,第三范式form...and更高(在我看来,高于第三范式有点深奥)。
这些定义的解释如下:
Normalization in plain English
What are 1NF, 2NF and 3NF in database design?
它可能看起来很抽象-但重点是要消除数据库中的任何歧义或重复,并防止进一步的问题。
正如srini.venigalla指出的那样-您的表不满足第一范式的标准-每行都应该有相同数量的数据,每个DB列一个。同样,这看起来可能是一个抽象的规则--但它是为了防止现实世界的问题--比如,我如何解析这个列值?我怎么知道分隔符是什么?如果它没有足够的数据点怎么办?如果有额外的列,它们的名称是什么?如果每列只有一个值,那么所有这些问题都会消失。
第二个范式和第三个范式也是如此-它们不允许在数据库中重复值/冗余,这可以防止数据库处于不一致状态的实际问题。
关于将数据库规范化到什么程度还存在争议/权衡--但对于初学者来说,让所有东西都满足第三种范式似乎是一个可以接受的经验法则。
(这是我在不得不为我自己的非1NF和非2NF数据库模式编写代码解决方案后得出的结论)
https://stackoverflow.com/questions/11364207
复制相似问题