查看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
据我了解,第一个语句意味着USER_ID
表的BILLING_DETAILS
将是唯一的,并引用USERS
表的primary_key,即references USERS
。
第二个使BILLING_DETAILS_ID
成为primary_key并引用USERS
的主键。
如果我们同时使用这两种one-to-one
关系,那么我们会有重复的字段:USER_ID
和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。
答案 1 :(得分:0)
BILLING_DETAILS_ID实际上是主键,这意味着它无法复制。但是,USER_ID不是,您可以在表BILLING_DETAILS中具有重复的USER_ID,它被视为应在表USER中具有引用的数据。
BILLING_DETAILS和USER之间的关系是一个(USER)到多个(BILLING_DETAILS)