2014-01-09 90 views
0

概念階段的問題:許多實體的一個地址表?

我有幾個表(機構)每個人都有多種地址郵件物理

有一種創建單個的方法地址表包含所有地址的一個實體?

我寧可沒有PersonAddressFactoryAddress etc表組。

還有其他的選擇嗎?

數據量最多隻有幾千個地址,所以影響很輕。

+3

呃,是嗎?如果您需要區分PersonAddress和FactoryAddress,則可以有一個類型列。 –

+0

@AaronBertrand只想看看你更喜歡哪一個......如果一個地址既是郵寄又是物理......你喜歡在表格中填寫地址兩次還是使用「郵寄」,「物理」位列來指定哪一個。這樣你只需要存儲一次地址。偏愛? –

+1

@samyi如果這是一個常見事件(它看起來像它),我可能會有BIT列,以避免存儲每個地址兩次。 –

回答

0

我建議依賴的原理是,一個實體(個人,機構,工廠等),可以有多個不會忽略,這在通常情況下(家庭,企業等),以及一個地址可以由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。

但是:根據我的觀點,「更好」的解決方案是將不同的實體合併到一張表中。然後,你將需要:

  1. 一個實體表,對所有實體
  2. 實體類型表,將包含不同的實體類型做出。 你的情況,你至少有3行:個人,工廠, 機構

如果每個實體一個ADRESS是不夠的,你可以去詳細地址作爲實體表的屬性。

如果您需要按實體多個地址,則必須使用地址表以Id_Entity作爲外鍵。

如果你想在多個實體之間共享一個地址,每個實體可能有多個地址(實體和地址之間是多對多的關係),那麼除了Entity之外你還需要去EntityAddres表和地址表。

這些模型之間的選擇取決於您的需求和業務規則。

0

你可以非常肯定地做到這一點。你可以讓地址表有一個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) 
) 

...等

+0

您的建議依賴於一個「實體」只有一個地址的原則,通常情況並非如此:家庭地址,工作地址,業務地址等。 –

+0

如果您可以有多個屬性副本(如地址) ,您需要將它們移動到單獨的表格中 - 這是!st標準形式的基本要求。雖然我不擔心太多違反第三範式,但違反第一範式是關係數據庫設計的自動紅旗。 –

+0

我誤解他需要一對多的關係,我的不好。 – DLeh

1

另一個基本\防彈系統將周圍組織模型:

  1. 一個實體表,對所有實體
  2. 實體類型表,將包含不同的實體類型做出。在你的情況下,你至少有3行:人員,工廠,機構

如果每個實體的一個地址足夠了,你可以將地址細節作爲實體表的屬性。

如果您需要按實體多個地址,則必須使用地址表以Id_Entity作爲外鍵。

如果你想在多個實體之間共享一個地址,每個實體可能有多個地址(實體和地址之間是多對多的關係),那麼除了Entity之外你還需要去EntityAddres表和地址表。

編輯:這個答案也與我在這裏給出的其他答案合併...所以我不知道它是否值得upvote!

1

您需要使用抽象和繼承。

一個individualinstitution(我叫它組織)實際上只是一個抽象legal party的具體表示。

A mailingphysical 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) 
); 
相關問題