2012-02-28 5 views
1

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

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

Простой ответ: они оба.

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

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

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

К сожалению, проблема с этим (хорошо) решениями многих ко многим отношений является то, что она часто бывает необходимо иметь два уникальные ключи на столе, 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.

Tech on the Net - действительно хороший ресурс для изучения синтаксиса.

+0

, который является частью причина, по которой мне нравится создавать эти пересекающиеся таблицы с собственным собственным ключом. Затем вы можете просто сохранить два других внешних ключа как уникальный идентификатор с несколькими столбцами. Но в любом случае все в порядке. +1, пожалуй, самый общий дизайн. – northpole

+0

@northpole, если вы не согласны, то определенно не нужно +1 :-). – Ben

+0

нет, я совсем не согласен, я просто делаю что-то по-другому. Ваше предложение хорошее и, вероятно, наиболее часто используемое решение. – northpole

1

Я бы предложил добавить уникальный, автоматически увеличивающий первичный ключ для PERSON_ORGANIZATION (называемый как po_id), а также два ИНОСТРАННЫХ ключа ssn и org_code. Вы также можете сделать эти два уникальных, если хотите. По моему опыту, мне нравится, что почти каждая таблица имеет свой собственный уникальный/автоматический ключ (если только это не таблица поиска или таблица аудита (и, возможно, другие)).

0

Они оба.

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

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

0

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

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

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

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

0

Это основная идею, вам необходимо обеспечить надлежащий тип данных для каждого поля

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) 

)

Смежные вопросы