2014-01-25 110 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”。 。 。 –