有一個客戶的新crm場景,他們有供應商和客戶,供應商也是客戶,反之亦然。每個層級的表只會讓一個人只能是一個或另一個,所以我認爲每種類型的表更適合。實體框架繼承
DB結構將是:
[Contact]
ContactId pk
Name
...
[Client]
ContactId pk/fk
VATNumber
...
[Supplier]
ContactId pk/fk
...
任何人有從類似的情景其他任何建議或經驗?
有一個客戶的新crm場景,他們有供應商和客戶,供應商也是客戶,反之亦然。每個層級的表只會讓一個人只能是一個或另一個,所以我認爲每種類型的表更適合。實體框架繼承
DB結構將是:
[Contact]
ContactId pk
Name
...
[Client]
ContactId pk/fk
VATNumber
...
[Supplier]
ContactId pk/fk
...
任何人有從類似的情景其他任何建議或經驗?
每種類型的表也將假設一個Contact
是客戶端或供應商(如果您查看生成的SQL,則更清晰:例如,請參閱"Inheritance with EF Code First CTP5: Part 2 – Table per Type (TPT)")。
相反,我認爲你需要改變你的模型爲Contact
和Contact-Role
與一對多的關係。 Contact-Role
將有Supplier
和Client
亞型。整個Contact-Role
層次可以被映射爲TPH或TPT。
這反映了一個面向對象的設計,其中每個客戶都有一個或多個角色(繼承「是一個」 releationship,永遠是獨特的,你不能有抽象類型client
這同時是client
兩種亞型的對象)。
這是行不通的,除非你將它建模爲三級繼承,這將要求客戶始終是供應商或供應商始終是客戶。我想這是不正確的模型在你的應用程序,這意味着你不能使用繼承。
您必須在contact-client和contact-supplier之間使用一對一(0..1-1)的關係,或者您可以簡單地將所有屬性放在單個表中,並添加IsClient
和IsSupplier
位列 - 它不是很好,它的可擴展性較差,但使用起來非常簡單。這兩個比特列在關係表示的情況下也是有用的。
謝謝理查德,這很有趣,你能詳細說明一下嗎? – Chev 2011-05-29 09:04:41
@Chev:我會試試。 – Richard 2011-05-29 10:22:46