2015-12-09 49 views
1

假設我有3個表格:enterprise, users, houses如何在SQL中創建表模型?

每個人都需要一個地址。我該怎麼辦?

  • 爲每個人創建表格地址?
  • 創建一個唯一的表地址?

假設第一個更「正確」(緩存,碎片,大小......),我應該如何在純SQL中編寫它?

如何創建表格地址的「模型」,並將其用於自定義表格(例如enterprise_address)? *所以當我改變模型中的一個字段時,它會被複制。

+3

從您的業務需求開始,設計一個數據庫來滿足它們。以後再擔心其他問題。 –

+0

@DanBracuk我真的同意你的看法。 「不成熟的優化是萬惡之源」。 – user1101

+0

@ user1101下面有一些非常好的答案。請隨時通過接受答案來結束您的問題。 – zedfoxus

回答

0

好吧,我找到了答案,PostgreSQL的:使用INHERITS

例如CREATE TABLE name() INHERITS (table_model)

謝謝大家的答案。

0

看來你需要每個用戶都有一個地址。你有多種方法來解決它。

處理它在UI

  • 您的用戶表將有關用戶的信息只是(在這裏的地址信息)
  • 作爲主鍵
  • 創建許多-TO-與addressid創建地址表所謂user_addresses許多表/結錶帶來的用戶名和addressid一起
  • 確保您的UI任務處理爲每個用戶

create table addresses (addressid int not null PK, line1, line2, city ...); 
create table users (userid int not null PK, username, ...); 
create table user_addresses (user_addressid int, userid int, addressid int, UK userid + addressid, FK to users, FK to addresses); 

這允許用戶有多個地址。您可以靈活地標記哪一個是主要的。

處理它在DB(和UI)

create table addresses (addressid int not null PK, ....); 
create table users (userid int not null PK, username varchar(20), ..., addressid int not null, FK to addresses); 

這允許每個用戶一個地址。

並在UI上處理它以確保提供地址。首先輸入地址,然後輸入用戶(使其成爲原子進程;使用交易!)

您可以從一個這些方法開始,並分析您的業務需求。如果您有DBA,請與您的DBA一起工作,看看他們的經驗對業務和以前的數據庫設計有什麼影響。

0

只是從三個給定的表格中,我會假設地址是你想要放在房屋或用戶的東西。

取決於你想在地址中追蹤多少細節,它可能是在製作一個單獨的表格,但有很多方法可以解決這個問題,正確的方法僅取決於你試圖實現的目標。

不知道任何所需的信息,我只能奉勸的是,你的目標應該是存儲地址作爲唯一的值。一旦你有了這個,你可以分配每個地址到你希望使用外鍵的任何其他表。

如果要存儲地址的多個字段,那麼你將需要一個單獨的表,如果單場會做那麼它可以很容易地被添加到人或房屋表。

一兩件事,這將使以哪種方式,你會想這樣做的一個主要區別是地址和其他實體之間的關係。例如,如果用戶可以擁有多個地址,那麼你不能將其作爲用戶表的一部分,並且如果一個地址可以有多個用戶分配給它,那麼它就不能使用FK來表示它與用戶表的關係。你可以這樣做

一種方法是使關係表。所以你讓地址和用戶分開表,然後有另一個表,只有一個id(pk)和2 fks將它鏈接到其他表中的每個表。如果你願意,這樣你可以有多對多的關係。

0

第一個問題:每家企業/用戶/房子多少地址?如果每個實體有多個地址,則會導致您想要一個單獨的地址表,可能使用地址類型。多個地址的情況下

例子:

  • 多個位置
  • 送貨地址
  • 物理與郵政信箱

如果你要斷言實體方能有一個地址,爲簡單起見,您可能更願意將地址部分作爲實體行。但是,可以有理由不這樣做;例如,表格寬度(表格中的列數)。

如果每個實體的多個地址,通常你會使用外鍵。實體應該有一個抽象鍵:某種類型的ID。這可能是一個整數,或者在SQL Server中,它可能是一個唯一標識符。實體ID將成爲地址密鑰的一部分。