定义具有许多共同列的表的最易于维护的解决方案是什么?
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 子句。每个实体仍然有不同的类型。
我有以下架构(这是一种方法):
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 子句。每个实体仍然有不同的类型。