【发布时间】:2014-11-18 13:41:04
【问题描述】:
我使用的是 sql server 2008。 我们有一个表来存储有关正在使用我们的应用程序的客户端的信息。 它的简化版本如下所示:
--------------------------------------------------------------------------------------------
| ClientName | Address1 | Address2 | PostalCode | ClientFullName | ClientNameAbbreviated |
--------------------------------------------------------------------------------------------
| Name | 111 Street | 222 Ave | A1A 1A1 | Full Name | FN |
--------------------------------------------------------------------------------------------
此表保存数据,以便报告和一般应用信息可以获取数据,而不是 将其硬编码为值或变量。这张表只有一行。
我正在考虑将此表转换为以下格式,以便于阅读。 该表仅用于在应用程序开始时填充一个类,然后该类用于在整个程序中检索信息。当客户端想要更多、更少或不同的信息而不是结构更改时,以下格式将允许更改为插入、删除和更新。由于此表中只有一行,因此除了可能增加字段长度之外,它永远不需要结构更改。
-----------------------------------------------
| ID | Value |
-----------------------------------------------
| ClientName | Company Name |
| Address1 | 111 Street |
| Address2 | 222 Ave |
| PostalCode | A1A 1A1 |
| ClientFullName | Full Company Name |
| ClientNameAbbrevation | CN |
-----------------------------------------------
我想知道在数据库设计方面有哪些优点和缺点,如果实施这种设计,我是否违反了任何不成文的数据库设计黄金法则?
-- 编辑 -------------------------------------------- --------------------------
感谢到目前为止的 cmets。
- 要点:突破 3NF
- 结论:并不真正适用于这种情况,因为第一个示例永远只有一行。
- 要点:所有值都是相同的数据类型,因此无法强制检查。
- 结论:一个很好的观点,让我倾向于第一个设计,但由于某些业务规则,检查约束可能无法在此表上强制执行。
【问题讨论】:
-
两种设计均未标准化。如果你不知道这意味着什么,我听说过这本书的好东西,数据库设计为凡人。
-
请记住:数据应该引用密钥、整个密钥,并且只能引用密钥(所以请帮帮我 Codd) - 您的设计中有几列是 不依赖于键,整个键 - 而是依赖于其他(假设非键)列
-
第二种设计的最大缺点是所有的值都必须是相同的类型。如果您使用具有多列和一行的表,则每列可以有自己的数据类型,可以有自己的约束,而对于单列,所有值都必须可转换为单一数据类型。
-
所以让我们稍后再说你想对邮政编码添加一个约束,现在它与所有其他数据混合在一起,你不能。你已经把自己编码到了一个角落。
-
如果这只是一个控制表,为什么要像这样将它分成多行?让它增长到它需要的宽度。这基本上与ini文件的配置文件相同,但在sql中。不要过度分析这一点,只需推出列并完成它。无论如何,这里的数据很可能几乎是静态的。
标签: sql sql-server database sql-server-2008 database-design