Создание массива varchars, ограниченных «ссылками» в SQL - PullRequest
0 голосов
/ 22 февраля 2012

Представьте себе

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
);

Конечно, это не работает, но (надеюсь) донесет до вас, читателя-человека, то, что я хочу: я хочу, чтобы заемщики имели в одном столбце массив (поскольку одновременно можно было бы извлечь несколько заголовков) и Я хочу быть уверенным, что в списке заимствованных заемщиков возможны только названия, которые находятся в таблице названий. Какой синтаксис для этого?

Ответы [ 3 ]

3 голосов
/ 22 февраля 2012

Почему бы не ввести третью таблицу и не хранить там все галочки для этого имени заемщика?Формирование массива в поле базы данных - это, на мой взгляд, яблоки и апельсины.

CREATE TABLE titles (
  bookTitle varchar(80)
);

CREATE TABLE borrowers (
  name varchar(80) --borrower's name
);

CREATE TABLE checkedout (
  name      varchar(80),
  bookTitle varchar(80)
);
2 голосов
/ 22 февраля 2012

Сохраняя массив, вы возможно нарушаете принцип атомарность и, следовательно, первую нормальную форму. Почему бы вместо этого не создать «правильную» модель реляционных данных?

Если одна книга может быть заимствована не более чем одним человеком за раз, вам необходимо отношение N: 1 в вашей модели данных, которое может быть достигнуто простым КЛЮЧОМ ИНОСТРАННОГО КЛЮЧА:

enter image description here

(TITLE.BORROWED_BY может быть установлено в NULL, если заголовок в настоящее время никем не заимствован.)

Если одна книга может быть заимствована несколькими людьми одновременно (что бы это ни значило), вашей модели потребуются отношения M: N, которые можно смоделировать с помощью дополнительной таблицы «ссылок» в середине:

enter image description here

0 голосов
/ 23 февраля 2012

Вы не можете (напрямую).Реляционные базы данных не имеют массивов;у них есть таблицы (отношения) и отношения между ними.Следовательно, в 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 ,
)

, но это ненормально , нарушив 1-ая нормальная форма : в ней есть повторяющиеся группы.

Требуемая схема выглядит примерно так:

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) ,

)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...