2015-05-31 56 views
1

不少次我看到了具有1到(1或0)關係的模型。例如: -SQL One to One關係(第二個表中的附加實體屬性)優點

CREATE TABLE accounts(login VARCHAR PRIMARY KEY, password VARCHAR); 
CREATE TABLE people(login VARCHAR PRIMARY KEY, name VARCHAR, inn VARCHAR, age INTEGER...); 

有時people對登錄列外鍵設置過,有時它不。

所以我的問題是這樣一個模型的優點和缺點是什麼,這裏的表是標準化的嗎? (據我所知他們是,但他們仍然看起來很奇怪)

PS。我有一個關於數據庫的家庭作業,我需要設計一個足夠複雜的模型。這是一些學生爲了製作更多表格而使用的技巧。

+0

是的,但我說的情況,每一個帳戶有1個或0個人。 – black

回答

2

執行一對一關係的一個實際原因是作爲解決MySQL存儲引擎的行大小限制的一種解決方法,而不對某些列實施LOB類型存儲(將它們移動到行存儲外)。

對於最大行大小,InnoDB的實際限制只有8000字節。只有幾個VARCHAR(4000)列會讓你超過這個限制。

另一個原因是它們實際上是分離的實體。在這裏,我使用術語「實體」,因爲它在實體關係建模技術中通常使用,(大致)定義爲「可以唯一標識我們需要存儲的信息的人,地點,事物,概念或事件」。如果真的是兩個獨立的實體,我們通常希望將它們作爲單獨的表來實現。關係的「1對1」性不是我們在兩個實體之間找到的通常關係(需求發現方式)。我們更頻繁地發現實體之間的一對多或多對多關係。

實現1對1(或1對0或1)的另一個原因是每個表的內容都由不同的進程「提供」。例如,一個負責在「人員」表中添加/更新行的進程,可能是從外部源加載該表的通宵工作。還有另一個過程負責添加/更新accounts表,也許這是一個在線web表單應用程序。我們有時會發現,最好每個表都由一個進程「提供」。

這些是我擁有的三大理由。否則,我只需要爲一個實體提供一張表。

2

除了斯賓塞的原因,這裏有幾個:

安全性:這是比較容易在表上指定的安全性比上一列。通過將密碼放在單獨的表格中 - 即使加密 - 訪問它們也更容易控制。

性能:這稱爲「垂直分區」。通常,一組列可能會佔用記錄空間的5%,但滿足90%的查詢。讀取附加列的開銷可能很大。

奧術要求:如果需要做一些像清除所有密碼的事情,可以用truncate table而不是update . . .完成。一個很大的優勢(除性能外)是個人密碼不會以日誌形式出現。

觸發器:如果某些列有觸發器update,則可能需要將它們隔離在單獨的表中,以減少觸發器調用的頻率。

至於這是否違反規範化原則。它可能會或可能不會。這取決於單獨的實例是否「看起來」像獨立的實體。

此外,我不會有login作爲公共密鑰。我會定義表更像是:

CREATE TABLE accounts (
    AccountId int not null auto_increment primary key, 
    login VARCHAR unique 
    password VARCHAR 
); 

CREATE TABLE people (
    PersonId int not null auto_increment primary key, 
    AccountId int references account(AccountId) 
    name VARCHAR, 
    . . . 
); 

(。這是示意性的MySQL忽略內嵌引用聲明,所以你會希望有一個明確的foreign key約束)

相關問題