建模賣家和產品
我正在嘗試對產品和賣家資訊進行建模。賣方可以是個人,也可以是公司,也可以是擁有分支機構的公司(產品由特定分支機構銷售)。每個產品只有一個關聯賣家(可以是個人、沒有分支機構的公司或特定公司的分支機構)。
我覺得我應該有一張個人表和另一張公司表(有父子關係,也許對自己,所以它可以代表公司-分支機構關係)。products 表可以有一個 individual_id(個人表的 PK)和一個 company_id(公司表的 PK)。products 表將只填充 individual_id 或 company_id 列。
不過,上面感覺很亂。
我覺得我可以只使用兩個表:產品和賣家。賣家表可以代表個人、公司或公司分支機構(這意味著賣家表需要這種父子關係,即使它不適用於個人——就像它不適用於某些公司一樣)。不過,個人和公司有不同的列——但我想把不適用的列留空)。
上面的模型好嗎?有什麼可能的缺點嗎?
此外,在設計數據庫時——將相關數據放在一個表中是否是個好主意?例如,公司需要儲存地址資訊。我是否將其放在 company_addresses 表中(表示 JOIN)。或者我只是將它們表示為公司/賣家表中的列(假設每個公司只有一個地址 - 但仍然可以將多個地址放在一行中,如 postal_address_line_1、physical_address_line_1 等)。
我的建議是這樣的:
您將為品牌、公司和個人提供不同的表格,因為它們具有不同的屬性……它們唯一的共同點是它們都是**
SELLERS
**. 請注意,我已經包括了公司和品牌之間的關係由於產品可以在沒有賣家的情況下存在(您可以在創建產品後幾天分配賣家),我不會在此表中放置任何外鍵;它還將使**
products
**表格保持清潔,僅具有產品屬性。現在,讓我們**
Sellers
**上桌(這不是實體的規範化……這只是他們在這個行業中扮演的角色):
- 因為該產品只有一個賣家;我包括與產品表的一對一關係。這意味著 product_id 是外鍵,也是主鍵。
- 所有其他外鍵都不是強制性的(它們都可以為空)
seller_check
, 是具有以下公式的計算欄位:seller_check SMALLINT AS( CASE WHEN company_id IS NULL THEN 0 ELSE 1 END + CASE WHEN brand_id IS NULL THEN 0 ELSE 1 END + CASE WHEN individual_id IS NULL THEN 0 ELSE 1 END) NOT NULL
- 最後,您需要包含一個表檢查約束,以確保只有一個外鍵不是 NULL:
ALTER TABLE sellers ADD CONSTRAINT sellers_ck_1 CHECK ( seller_check <= 1 );
祝你好運!