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

What would be the most maintainable solution to define tables that have many columns in common?

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

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) 将它们全部倾倒在一个 table 中,这可能是最丑陋的。 (或者也许我做的事情从根本上是错误的。)

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

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

您可以更深入地研究规范化,还可以创建一个 table 来查找每个 table 的类型列,以避免数据冗余。

您可以想到 table 继承,但尝试按照您的业务现实的表示方式对其进行建模。正如您已经注意到的那样,避免使用第二种方法 "the ugliest"。

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