想象
CREATE TABLE titles (
bookTitle varchar(80)
);
CREATE TABLE borrowers (
name varchar(80), --borrower's name
checkedOut varchar(80)[] references titles(bookTitle) --list of checked out
);
当然这不起作用,但它(希望)让人类读者了解我想要的东西:我希望借款人在一个列中有一个数组(因为一次可以检出多个标题)和我想确保在借阅者的签出标题列表中只有标题表中的标题是可能的。这是什么语法?
答案 0 :(得分:3)
为什么不引入第三个表并将那个借用者名称的所有checkedOut存储在那里?在我看来,强制数组进入数据库字段是苹果和橘子。
CREATE TABLE titles (
bookTitle varchar(80)
);
CREATE TABLE borrowers (
name varchar(80) --borrower's name
);
CREATE TABLE checkedout (
name varchar(80),
bookTitle varchar(80)
);
答案 1 :(得分:2)
通过存储数组,你可能会违反atomicity的原则,从而违反第一个正规形式。为什么不改为建立一个“适当的”关系数据模型呢?
如果一本书一次只能借一本书,你的数据模型中需要N:1关系,这可以通过一个简单的外键来实现:
(如果标题当前未被任何人借用,则TITLE.BORROWED_BY
可以设置为NULL。)
如果一个人可以一次借用一本书(无论这可能意味着什么),你的模型就需要一个M:N关系,可以通过中间的另一个“链接”表来建模:
答案 2 :(得分:0)
你不能(直接)。关系数据库没有数组;他们有表(关系)和他们之间的关系。因此,SQL没有数组的概念。
您可以执行以下操作:
create table foo
(
id int not null primary key ,
col_01 varchar(200) null ,
col_02 varchar(200) null ,
...
col_nn varchar(200) null ,
)
但那是non-normal,违反1st Normal Form:它有重复的群组。
您想要的架构类似于
create table book
(
id int not null primary key , -- primary key
isbn varchar(32) null ,
title varchar(80) not null , -- can't use title as a key as titles are not unique
)
-- you might have multiple copies of the same book
create table book_copy
(
book_id int not null ,
copy_number int not null ,
primary key ( book_id , copy_number ) ,
foreign key ( book_id ) references book(id) ,
)
create table customer
(
id int not null primary key ,
surname varchar(32) not null ,
name varchar(32) not null ,
)
create table customer_has_book
(
customer_id int not null ,
book_id int not null ,
copy_number int not null ,
primary key ( customer_id , book_id , copy_number ) , -- customer+book+copy number is unique
unique ( book_id , copy_number ) , -- a given copy may only be borrowed one at a time
foreign key ( customer_id ) references customer(id) ,
foreign key ( book_id , copy_number) references book_copy(book_id,copy_number) ,
)