2014-03-25 84 views
0

我想知道在數據庫中的子表中有重複的ID有什麼優點和缺點。在兒童表中重複的ID

例如,考慮表parent

create table parent (
    id int, 
    a text, 
    b text 
) 

parentchild1表引用它:

create table child1 (
    id int, 
    parent_id int not null references parent(id), 
    c text, 
    d text 
) 

所有優秀和良好,並沒有什麼不尋常的。這個問題是在你不停下鑽:

create table child2 (
    id int, 
    child1_id int not null references child1(id), 
    e text, 
    f text 
) 

create table child3 (
    id int, 
    child2_id int not null references child2(id), 
    g text, 
    h text 
) 

我有是問題,進一步的你下來,越繁瑣就變成向上加入你的方式。一個解決方案,我認爲是重複parent ID中的所有兒童表:

create table child2 (
    id int, 
    parent_id int not null references parent(id), 
    child1_id int not null references child1(id), 
    e text, 
    f text 
) 

create table child3 (
    id int, 
    parent_id int not null references parent(id), 
    child2_id int not null references child2(id), 
    g text, 
    h text 
) 

這有助於減少連接的數量,但它也影響數據庫的完整性。如果切換child1的父項,則需要始終記住更新所有parent_id列。我的問題是:是否有其他方法來處理這種情況?如果沒有,是否有任何方法可以在保留數據完整性的情況下在兒童表中重複一個ID?

回答

1

我從你的例子假設是很重要的關係變爲父< -child1 < -child2,而不是父母< -child1和家長< -child2。

那麼像這樣的東西呢。

create table parent 
(
    id int, 
    a text, 
    b text 
); 

create table child 
(
    id int, 
    parent_id int null references parent(id), 
    previous_child_id int null references child(id) 
    c text, 
    d text 
); 

是比較歸一化將是這樣的第二種方法。這假定parent_child上的id可以被認爲是一個遞增的整數,所以你可以總是找出孩子的順序。

create table parent 
(
    id int PRIMARY KEY, 
    a text, 
    b text 
); 

create table child 
(
    id int PRIMARY KEY, 
    parent_id int null references parent(id), 
    previous_child_id int null references child(id) 
    c text, 
    d text 
); 

create table parent_child 
(
    id serial PRIMARY KEY, 
    parent_id int null references parent(id), 
    child_id int null references child(id) 
); 
0

通過@JustKim解決方案是好的,但如果PARENT_ID爲空,你可以走得更遠

create table person 
(
    id int, 
    parent_id int null references person(id), 
    c text, 
    d text 
); 

,該記錄是父。

當然,要獲得一個父母的所有孩子,你必須在你的代碼中使用遞歸。