基于PostgreSQL继承的数据库设计

Jdr*_*uwe 5 postgresql database-design inheritance

我正在开发一个简单的保姆应用程序,它有两种类型的用户:“父母”和“保姆”。我使用 postgresql 作为我的数据库,但我在设计我的数据库时遇到了麻烦。

'Parent' 和 'Babysitter' 实体具有可以概括的属性,例如:用户名、密码、电子邮件……这些属性可以放置在名为“用户”的父实体中。它们也都有自己的属性,例如:Babysitter -> age。

就 OOP 而言,事情对我来说非常清楚,只需扩展用户类就可以了,但在 DB 设计中,情况有所不同。在发布这个问题之前,我在互联网上漫游了一周,以寻找对这个“问题”的洞察。我确实找到了很多信息,但
在我看来,有很多分歧。以下是我读过的一些帖子:

/sf/ask/13320751/ : Table-Per-Type (TPT), Table-Per-Hierarchy (TPH) 和 Table- Per-Concrete (TPC) VS '将 RDb 强制转换为基于类的需求是完全不正确的。

多种用户类型 - 数据库设计建议

Table: `users`; contains all similar fields as well as a `user_type_id` column (a foreign key on `id` in `user_types`
Table: `user_types`; contains an `id` and a `type` (Student, Instructor, etc.)
Table: `students`; contains fields only related to students as well as a `user_id` column (a foreign key of `id` on `users`)
Table: `instructors`; contains fields only related to instructors as well as a `user_id` column (a foreign key of `id` on `users`)
etc. for all `user_types`
Run Code Online (Sandbox Code Playgroud)

mysql如何对两个表的继承进行建模

/sf/ask/215217481/:postgresql 中的继承对我和其他一些用户来说并不像原始海报指出的那样按预期工作。

我真的很困惑我应该采取哪种方法。Class-table-inheritance ( https://stackoverflow.com/tags/class-table-inheritance/info ) 在我的 OOP 心态中似乎是最正确的,但我非常感谢并更新了 DB 思想的观点。

Wal*_*tty 3

使用单表继承还是类表继承更好实际上取决于您的情况的具体情况。性能优势可以是任意一种。表中存在大量 NULL 所带来的困难从微不足道到难以承受。这取决于您的数据是什么样的以及您打算做什么。

感谢您发现问题基本上是由于对象建模和关系建模之间的不匹配造成的。

PS,如果您使用 UserID 作为 Parent 和 Babysitter 的主键,并将其声明为外键,您将获得一些好处,但在插入新用户时需要进行一些编程。这种技术称为共享主密钥,它也在 SO 上出现。