概念階段的問題:許多實體的一個地址表?
我有幾個表(人,機構,廠)每個人都有多種地址(郵件,物理)
有一種創建單個的方法地址表包含所有地址的一個實體?
我寧可沒有PersonAddress和FactoryAddress etc表組。
還有其他的選擇嗎?
數據量最多隻有幾千個地址,所以影響很輕。
概念階段的問題:許多實體的一個地址表?
我有幾個表(人,機構,廠)每個人都有多種地址(郵件,物理)
有一種創建單個的方法地址表包含所有地址的一個實體?
我寧可沒有PersonAddress和FactoryAddress etc表組。
還有其他的選擇嗎?
數據量最多隻有幾千個地址,所以影響很輕。
我建議依賴的原理是,一個實體(個人,機構,工廠等),可以有多個不會忽略,這在通常情況下(家庭,企業等),以及一個地址可以由d的實體共享無性質:
CREATE TABLE ADDRESS
(
ID INT IDENTITY PRIMARY KEY NOT NULL,
.... (your adress fields here)
id_Person ... NULL,
id_Institution ... NULL,
id_Factory ... NULL
)
主要限制是2個不同的人不能共享相同的地址。在這種情況下,你必須去與一個額外的「EntityAddress」表,像這樣:
CREATE TABLE ADDRESS
(
ID INT IDENTITY PRIMARY KEY NOT NULL,
.... (your adress fields here)
)
CREATE TABLE ENTITY_ADDRESS
(
ID INT IDENTITY PRIMARY KEY NOT NULL
id_Address .... NOT NULL,
id_Person .... NULL,
id_Institution ... NULL,
id_Factory .... NULL
)
最後一個模型可以讓你分享,例如在同一機構工作的多個人一個ADRESS。
但是:根據我的觀點,「更好」的解決方案是將不同的實體合併到一張表中。然後,你將需要:
如果每個實體一個ADRESS是不夠的,你可以去詳細地址作爲實體表的屬性。
如果您需要按實體多個地址,則必須使用地址表以Id_Entity作爲外鍵。
如果你想在多個實體之間共享一個地址,每個實體可能有多個地址(實體和地址之間是多對多的關係),那麼除了Entity之外你還需要去EntityAddres表和地址表。
這些模型之間的選擇取決於您的需求和業務規則。
你可以非常肯定地做到這一點。你可以讓地址表有一個ID,那麼人員,機構和工廠都可以有地址表的外鍵。
如果您需要能夠區分它是在地址級別什麼樣的地址,你可以考慮增加一個地址類型表,並具有地址表
例的外鍵是:
CREATE TABLE ADDRESS
(
ID INT IDENTITY PRIMARY KEY NOT NULL,
City VARCHAR(50) NOT NULL,
State VARCHAR(2) NOT NULL,
Zip VARCHAR(10) NOT NULL,
AddressLine1 VARCHAR(200) NOT NULL,
AddressLine2 VARCHAR(200) NOT NULL,
)
CREATE TABLE Person
(
ID INT IDENTITY PRIMARY KEY NOT NULL,
AddressID INT FOREIGN KEY REFERENCES Address(ID)
)
CREATE TABLE Institution
(
ID INT IDENTITY PRIMARY KEY NOT NULL,
AddressID INT FOREIGN KEY REFERENCES Address(ID)
)
...等
您的建議依賴於一個「實體」只有一個地址的原則,通常情況並非如此:家庭地址,工作地址,業務地址等。 –
如果您可以有多個屬性副本(如地址) ,您需要將它們移動到單獨的表格中 - 這是!st標準形式的基本要求。雖然我不擔心太多違反第三範式,但違反第一範式是關係數據庫設計的自動紅旗。 –
我誤解他需要一對多的關係,我的不好。 – DLeh
另一個基本\防彈系統將周圍組織模型:
如果每個實體的一個地址足夠了,你可以將地址細節作爲實體表的屬性。
如果您需要按實體多個地址,則必須使用地址表以Id_Entity作爲外鍵。
如果你想在多個實體之間共享一個地址,每個實體可能有多個地址(實體和地址之間是多對多的關係),那麼除了Entity之外你還需要去EntityAddres表和地址表。
編輯:這個答案也與我在這裏給出的其他答案合併...所以我不知道它是否值得upvote!
您需要使用抽象和繼承。
一個individual
和institution
(我叫它組織)實際上只是一個抽象legal party
的具體表示。
A mailing
或physical address
是摘要address
的結論,該摘要也可以是電子郵件地址,電話號碼或網址。
A legal party
可以有零個或多個addresses
。
一個address
可以屬於零個或多個legal parties
。
一方可以爲多個角色使用相同的地址,例如「家庭」地址和「工作」地址。
如果一個factory
足夠大,工廠中的子設施可能有自己的地址,因此您可能需要考慮其中的等級關係。例如,公寓中的每個公寓都有一個地址。大型工廠中的每座建築都可能有自己的地址。
create table party (
party_id identity primary key
);
create table individual (
individual_id int primary key references party(party_id),
...
);
create table organization (
organization_id int primary key references party(party_id),
...
);
create table address (
address_id identity primary key,
...
);
create table mailing_address (
address_id int primary key references address(address_id),
...
);
create table party_address (
party_id int references party(party_id),
address_id int references address(address_id),
role varchar(255), --this should really point to a role table
primary key (party_id, address_id, role)
);
create table facility (
facility_id identity primary key,
address_id int not null references address(address_id),
parent_id int null references facility(facility_id)
);
呃,是嗎?如果您需要區分PersonAddress和FactoryAddress,則可以有一個類型列。 –
@AaronBertrand只想看看你更喜歡哪一個......如果一個地址既是郵寄又是物理......你喜歡在表格中填寫地址兩次還是使用「郵寄」,「物理」位列來指定哪一個。這樣你只需要存儲一次地址。偏愛? –
@samyi如果這是一個常見事件(它看起來像它),我可能會有BIT列,以避免存儲每個地址兩次。 –