我有以下架构(这是一种方法):
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)将所有这些解决方案转储到一个可能是最丑的表中。 (或许我做的事情根本就是错误的。)
答案 0 :(得分:0)
这是设计OLTP系统时的正确方法。请记住,数据库中有多个表不会使它们的读取速度变慢,称为数据库规范化。
最好让字典表在一个表中联系并管理它们,并在不同的表中使用外键添加对它的引用,实现实体之间的1:N关系。
您可以深入了解规范化,并在每个表的类型列上创建一个查找表,以避免数据冗余。
您可以考虑表继承,但尝试以表示业务现实的方式对其进行建模。避免采用第二种方式,即最丑陋的方式。正如你已经注意到的那样。
继承可能不是您正在寻找的 - 检查FROM ONLY子句。每个实体仍然有不同的类型。