定义具有许多共同列的表的最可维护的解决方案是什么?

时间:2017-07-19 22:39:23

标签: postgresql database-schema

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

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)将所有这些解决方案转储到一个可能是最丑的表中。 (或许我做的事情根本就是错误的。)

1 个答案:

答案 0 :(得分:0)

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

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

您可以深入了解规范化,并在每个表的类型列上创建一个查找表,以避免数据冗余。

您可以考虑表继承,但尝试以表示业务现实的方式对其进行建模。避免采用第二种方式,即最丑陋的方式。正如你已经注意到的那样。

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