Создание таблиц - PullRequest
       13

Создание таблиц

1 голос
/ 29 февраля 2012

Предположим, у вас есть следующая база данных:

Person(ssn NUMERIC(9), name VARCHAR(40), gender CHAR(1)), ssn is primary key

Organization(org_code CHAR(4), budget INTEGER, org_name VARCHAR(60)), org_code is primary key

Person_Organization(ssn, org_code), both columns are the primary key.

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

CREATE TABLE person_organization(ssn NUMERIC(9), org_code VARCHAR(60));

Любые предложения будут с благодарностью.

Спасибо.

Ответы [ 5 ]

5 голосов
/ 29 февраля 2012

Простой ответ заключается в том, что они оба.

ssn, org_code должен быть первичным ключом person_organization.

ssn должен быть внешним ключом обратно в лицо иorg_code должен по внешнему ключу вернуться в organization.

Чтобы отделить себя от ответа северного полюса Я на самом деле не согласен с аргументом суррогатного ключа, в данном случае это не таккажется, что это необходимо, так как он больше нигде не будет использоваться.

К сожалению, проблема с этим (хорошим) решением связи «многие ко многим» заключается в том, что часто необходимо иметь два уникальных ключа в таблице, ssn, org_code и org_code, ssn и выберите один из них в качестве первичного ключа.


Поскольку вы используете Oracle, синтаксис создания таблицы будет

create table person_organization
( ssn number(9)
, org_code varchar2(60)
, constraint person_organization_pk primary key (ssn, org_code)
, constraint person_organization_ssn_fk foreign key ( ssn )
    references person ( ssn )
, constraint person_organization_oc_fk foreign key ( org_code )
    references organization ( org_code )
 );

В вашем оригинальном скрипте создания таблицы у вас было ssn как numeric(9), что должно быть number(9).Возможно, вы захотите не ограничивать размер этого типа данных.У вас также было org_code как varchar, это, вероятно, должно быть varchar2.

Технология в сети - действительно хороший ресурс для изучения синтаксиса.

1 голос
/ 29 февраля 2012

Я бы предложил добавить уникальный, автоматически увеличивающийся первичный ключ к PERSON_ORGANIZATION (называемый что-то вроде po_id), а также два FOREIGN-ключа ssn и org_code. Вы также можете сделать эти два уникальных, если хотите. Исходя из моего опыта, я хотел бы, чтобы почти у каждой таблицы был свой уникальный ключ / ключ auto (если только это не таблица поиска или таблица аудита (и, возможно, другие)).

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

Это основная идея, вам нужно предоставить правильный тип данных для каждого поля

CREATE TABLE Persons (
  ssn int(9) NOT NULL PRIMARY KEY,
  name varchar(40),
  gender CHAR(1)
)

CREATE TABLE Organization (
  org_code CHAR(4)NOT NULL PRIMARY KEY,
  budget INTEGER,
  org_name VARCHAR(60)
)

CREATE TABLE Person_Organization (
  ssn int FOREIGN KEY REFERENCES Persons(ssn),
  org_code CHAR FOREIGN KEY REFERENCES Organization(org_code)

)

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

Это внешние ключи.

Вы перечислили "оба столбца являются первичным ключом", но я не думаю, что они есть.

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

Я бы такжеРекомендуется добавить отдельное поле первичного ключа для соответствия структуре других таблиц.Как и в других таблицах, я рекомендую всегда использовать либо id [my favourite], либо tablename_id

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

Они оба.

Для таблицы person_organization у вас будет составной первичный ключ, состоящий из двух столбцов. Каждый отдельно является внешним ключом для другой таблицы.

Для нормального проектирования базы данных они должны ссылаться на первичные ключи в других таблицах, и эти ограничения обеспечивают достоверность данных в базе данных.

...