2

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

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

4

3 回答 3

3

严格来说,您不应该将一组值放在一列中。它违反了关系数据的第一范式。创建一个名为自定义数据(Config_ID、CUSTOM_NAME、CUSTOM_DATA_VALUE、CUSTOM_DATA_TYPE)的单独表并将自定义值存储在其中。

于 2012-07-06T14:38:56.230 回答
0

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

于 2012-07-06T14:35:59.743 回答
0

有一种标准的方法来布置数据库表以使其易于管理 - 称为规范化。标准化有不同的级别——第一范式、第二范式、第三范式……甚至更高(在我看来,高于第三范式有点深奥)。

这些定义的解释在这里:

简单英语的规范化

什么是数据库设计中的 1NF、2NF 和 3NF?

它可能看起来很抽象 - 但关键是要消除数据库中的任何歧义或重复,并防止进一步出现问题。

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

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

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

(这是我在为我自己的非 1NF 和非 2NF 数据库模式编写代码变通办法后得出的结论)

于 2013-07-25T14:06:34.590 回答