我已阅读以下文章如何有效地建模数据库中的继承?关于数据库中的继承。不幸的是,我在 Packt 的 PostgreSQL 书籍中找不到任何东西。现在我有点困惑,如果我的方法是矫枉过正,甚至不属于数据库或有意义(见最后我的考虑)。
首先,我想使用Table-Per-Concrete来实现以下示例。但是后来我读了几次,你应该只在你真的有性能问题时才这样做,并且只要你没有性能问题,就应该使用每种类型的表。
所以给出以下关系:
system_user (system_user_id, type, first_name, last_name, ...)
user (system_user_id) *Has no unique attributes but special relations accessible only for him, e.g. orders
customer (system_user_id, company_name, ...)
supporter (system_user_id, nickname, ...)
到目前为止一切顺利,但我想知道如何在上面的示例中确保:
- 类型不能更改。
- 一个 system_user 在一个扩展中最多有一个条目。
我的考虑:
- 如果在 UPDATE 期间更改类型,则会引发错误的触发器。
- 每个扩展都有一个触发器,它在插入之前检查是否具有此 system_user_id 的条目已存在于另一个扩展中。
这有意义吗?还是我走错了路?这甚至有必要吗?我应该直接为每个实体创建一个单独的关系吗?
也许我对它有太多的面向对象软件开发人员的看法。非常感谢你的回答。
我认为您的数据模型是有道理的。我将添加
type
到“子类”表中,创建唯一约束(system_user_id, type)
并创建指向system_user
. 然后向子类表添加一个检查约束,以确保它type
具有正确的值。这避免了使用触发器。