【问题标题】:Table with one row vs Table with vertical list单行表与垂直列表表
【发布时间】: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


【解决方案1】:

当所需的结构发生变化时,您可以使用名称/值对。例如,您存储产品,50% 有材料组合,2% 有 CPU 类型,3% 有 rpm,20% 有能源等级。您可以使用通用方法,而不是构建可能包含一千个此类属性的表。但是这样做是有代价的:dbms 不知道您的内容,也无法帮助您确保完整性。

在您的情况下,没有 dbms 的帮助,您无需勉强。所以不要这样做。保持表格原样,让 dbms 知道什么是字符串、数字、日期,什么是强制性的,什么是可选的,什么必须是有效的国家 ISO 代码或正好 13 个字符的字符串,这样它就可以确保正确性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-16
    • 2022-08-04
    • 2010-11-07
    • 1970-01-01
    • 2017-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多