[英]Abstract databases design.
因此,我正在創建一個具有來自不同國家/地區的不同用戶類型的Web應用程序。 用戶類型的示例是company
, staff
等。公司將具有company_name
字段,而staff則沒有。
在users
數據庫中,我不知道它是否實現,即每個用戶的每列一個表的做法屬性會有一個外鍵這將是一個表是一個好主意user_id
和value
的屬性值。
例如。 users.company_name = id(PK), | user_id(FK) | 'company_name' 1 | 1 | company 1
users.email = id(PK), | user_id(FK) | 'email' 1 | 1 | user@email.com
對於不同國家的地址具有不同值的address
數據庫,也可以使用相同的方法。
意見?
您要查找的術語是“ 派對模型 ”
您想要使用表繼承†(也稱為子類型/超類型關系)來對此類事物進行建模。
個人是抽象法人的一種構想。 組織(例如公司)也是抽象法人的具體構想。
“工作人員”不是合法政黨的子類型。 這是公司與個人之間的關系。 一個公司有很多員工與個人的關系。
我建議使用Single Table Inheritance ,因為它既快速又簡單。 如果您真的不喜歡null,請使用Class Table Inheritance 。
create table parties (
party_id int primary key,
type smallint not null references party_types(party_type_id), --elided,
individual_name text null,
company_name text null,
/* use check constraints for type vs individual/company values */
);
如果您要使用單表繼承,那么我將通過MySQL(或MariaDB)使用PostgreSQL,因為后者不支持檢查約束。
您可以使user
屬於party
,也可以使聚會具有一個user
。
†與PostgreSQL的繼承功能不同。
我將使用company_name
和email
列創建一個單個用戶表。
對於地址表,我將從類似以下的簡單內容開始:id,address_line_1,address_line_2,城市,州,國家/地區,郵政編碼。
使用這種策略,您將必須執行很多聯接表才能獲得有意義的查詢結果。 結果,您的性能將受到影響,並且存儲的使用效率非常低。
您至少應組合通常在應用程序中為邏輯實體組合的列。 因此,如果“公司”與“工作人員”的不同之處在於它具有額外的列,則可以創建表“ users.company_properties”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.