【问题标题】:What would be the most maintainable solution to define tables that have many columns in common?定义具有许多共同列的表的最可维护的解决方案是什么?
【发布时间】:2017-07-19 22:39:23
【问题描述】:

我有以下架构(这是一种方法):

CONTACTS
--------
|id    |
|name  |--------------------------
--------        \                 \
|                \                 \
|                 \                 \
^                  ^                 ^
PHONE_NUMBERS    ADDRESSES        EMAILS    
--------------   --------------   --------------
|id          |   |id          |   |id          |
|FK(contacts)|   |FK(contacts)|   |FK(contacts)|
|preferred   |   |preferred   |   |preferred   |
|type        |   |type        |   |type        |
|inserted_at |   |inserted_at |   |inserted_at |
| ---------- |   | ---------- |   | ---------- |
|phone_no    |   |address     |   |email       |   
--------------   |city        |   --------------
                 |(...)       |

我想出的另外两个解决方案是 (1) inheritence 和 (2) 将它们全部倾倒在一张桌子上,这可能是最丑陋的。 (或者也许我在做一些根本错误的事情。)

【问题讨论】:

    标签: postgresql database-schema


    【解决方案1】:

    这是设计 OLTP 系统时的正确方法。请记住,在数据库中拥有多个表不会使读取它们的速度变慢,这称为数据库规范化。

    最好有一个字典表联系人并在一个表中管理它们,并使用不同表中的外键添加对它的引用,实现实体之间的 1:N 关系。

    您可以更深入地研究规范化,并为每个表创建一个用于查找您的类型列的表,以避免数据冗余。

    您可以考虑表继承,但尝试按照您的业务现实的表示方式对其进行建模。避免使用您已经注意到的“最丑陋”的第二种方法。

    继承可能不是您想要的 - 检查 FROM ONLY 子句。每个实体仍然有不同的类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-01
      • 1970-01-01
      • 2011-07-12
      • 2011-12-17
      • 2017-03-13
      • 2022-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多