2014-01-25 109 views
0

看着從Java Persistence with Hibernate一個例子,有2個表:重複主鍵?

create table USERS (
    USER_ID bigint not null primary key, 
    USERNAME varchar(15) not null unique, 
    NAME varchar(50) not null, 
    ... 
) 
create table BILLING_DETAILS (
    BILLING_DETAILS_ID bigint not null primary key, 
    ACCOUNT_NUMBER VARCHAR(10) not null unique, 
    ACCOUNT_NAME VARCHAR(50) not null, 
    ACCOUNT_TYPE VARCHAR(2) not null, 
    USER_ID bigint foreign key references USERS 
) 

書中提到,以下指示many-to-one關係:

USER_ID bigint foreign key references USERS

其次,它說,下面的SQL語句顯示one-to-one協會:

USER_ID bigint unique foreign key references USERS 
BILLING_DETAILS_ID bigint primary key foreign key references USERS 

據我所知,第一條語句表示BILLING_DETAILS表中的USER_ID將是唯一的,並引用USERS表的主鍵,即references USERS

第二個使BILLING_DETAILS_ID爲primary_key並引用USERS的主鍵。

如果我們使用了這兩個one-to-one關係,那麼我們會有重複的字段:USER_IDBILLING_DETAILS_ID,因爲它們實際上是相同的數據?

+0

「主鍵」(即「billiing_details_id」)與唯一列之間存在差異。只有一列(或一組列)可以是主鍵。 –

+0

@GordonLinoff,所以,執行兩個SQL 1對1語句會導致重複的字段,但不同之處在於只有'BILLING_DETAILS_ID'將是主鍵? –

+0

這些字段可能不是重複的。上面的代碼沒有指定如何填充值。如果您使主鍵自動遞增,那麼它們會非常相似(比如競爭條件可能會導致值的差異)。 –

回答

1

它們不一定在沒有附加CHECK()約束的相同的數據,需要用戶ID和帳單詳細信息ID必須相同。

我還沒有讀過這本書,但作爲一名數據庫專業人員,我認爲實施一對一的關係是錯誤的。 billing_details.user_id上的唯一約束以及明顯的外鍵約束足以保證兩個表之間的一對一關係。 (這樣的關係並沒有多大意義,在現實世界中,不過,當你想想結算明細手段。)

從數據庫的角度來看,讓billing_details.user_id可空似乎值得商榷了。


後來。 。 。

我只是想了解這本書的另一種解釋。當它說

USER_ID bigint unique foreign key references USERS 
BILLING_DETAILS_ID bigint primary key foreign key references USERS 

它描述兩個不同方式來實現一比一的關係。這並不是說你應該使用這兩個語句來實現一個一對一的關係。

但是,這也是一個錯誤,因爲USER_ID沒有被聲明爲NOT NULL。

0

BILLING_DETAILS_ID實際上是主鍵,這意味着它不能被複制。但是,USER_ID不是,您可以在表BILLING_DETAILS中重複使用USER_ID,它將被視爲應在USER表中引用的數據。

BILLING_DETAILS與用戶之間的關係是一個(USER)一對多(BILLING_DETAILS)

+0

您錯過了「USER_ID bigint unique」。 。 。 –