基於Postgresql繼承的數據庫設計
我正在開發一個簡單的保姆應用程序,它有兩種類型的使用者:“父母”和“保姆”。我正在使用 postgresql 作為我的數據庫,但我在製定我的數據庫設計時遇到了麻煩。
‘Parent’ 和 ‘Babysitter’ 實體具有可以概括的屬性,例如:使用者名、密碼、電子郵件……這些屬性可以放置在稱為“User”的父實體中。他們都有自己的屬性,例如:Babysitter -> age。
就 OOP 而言,我非常清楚,只需擴展使用者類就可以了,但在 DB 設計中情況有所不同。在發布這個問題之前,我在網際網路上漫遊了一周,尋找對這個“問題”的洞察力。我確實找到了很多資訊,但
在我看來,存在很多分歧。以下是我讀過的一些文章:
https://stackoverflow.com/questions/190296/how-do-you-effectively-model-inheritance-in-a-database: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`
https://stackoverflow.com/questions/3074535/when-to-use-inherited-tables-in-postgresql:postgresql 中的繼承對於我和其他一些使用者來說並沒有像原始發布者指出的那樣工作。
我真的很困惑我應該採取哪種方法。Class-table-inheritance ( https://stackoverflow.com/tags/class-table-inheritance/info ) 在我的 OOP 思維方式中似乎是最正確的,但我非常感謝和更新 DB 的意見。
無論您是使用單表繼承還是類表繼承更好,這實際上取決於您的案例的具體情況。性能優勢可以是任何一種方式。表中存在大量 NULL 所帶來的困難從微不足道到壓倒性的。這取決於您的數據是什麼樣的,以及您打算做什麼。
感謝您發現問題基本上是由於對象建模和關係建模之間的不匹配造成的。
PS如果您在Parent和Babysitter上都使用UserID作為主鍵,並將其聲明為外鍵,您將獲得一些好處,但在您插入新使用者時需要進行一些程式。這種技術稱為共享主鍵,它也在 SO 上介紹過。