2013-10-14 5 views
1

У меня есть быстрый вопрос. Может ли таблица иметь только первичный ключ в качестве внешнего ключа?Может ли внешний ключ быть единственным первичным ключом

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

create table Pet(
Name varchar(20), 
Owner char(1), 
Color varchar(10), 
primary key(Name, Owner), 
foreign key(Owner) referecnes Person(Ssn) 
); 

Так вот мне интересно, если это возможно, чтобы сделать что-то вроде этого:

create table WorksAs(
Worker char(1), 
Work varcahr(30), 
primary key(Worker), 
foreign key(Worker) references Person(Ssn) 
); 

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

+0

Я думаю, ваша таблица WorkAs должна быть реляционной таблицей. Это означает, что вы можете иметь таблицу с WorkPlaces, например, таблицу с Workers и таблицу WorksA, чтобы установить связь с Worker-> WorkPlace. В противном случае, почему бы вам не использовать одну и ту же таблицу (Рабочий) и добавить столбец с char Workplace? Но отвечая на ваш вопрос, да, вы можете его получить. –

+0

Я бы сказал, это прекрасно. Однако ... Почему бы не переместить эти поля (в WorksAs) непосредственно в таблицу Person (там, где она может быть нулевой)? Еще одна таблица. Еще меньше. –

+0

Прежде всего, это просто плохой пример, который я придумал, задав этот вопрос, потому что мне было легче объяснить, что я хотел знать. Во-вторых, причина, по которой я хотел знать это, был явным, я работал с заданием, в котором мы должны были высвечивать значения NULL из наших баз данных. Поэтому, если я поместил WorksAs в таблицу Person, у меня возникла бы проблема возможных значений NULL, которые я не хочу :) –

ответ

1

Да. Из-за следующих причин.

  1. Создание первичного ключа приведет к уникальности (в отличие от него).
  2. Первичный ключ предположительно будет сгруппирован (в зависимости от dbms), что улучшит производительность для некоторых запросов.
  3. Это экономит пространство, добавив ограничение уникальности, которое в некоторой СУБД также создает уникальный индекс
1

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

+0

Хотя это, безусловно, верно, OP специально спросил о «Может ли таблица иметь только первичный ключ в качестве внешнего ключа?», Поэтому я предполагаю, что он добавит ограничение первичного ключа в таблицу подробностей. –

+0

Достаточно справедливо ..Но я, будучи начальником в mysql, первым делом, который возник в моем сознании, был то, что Jesper может столкнуться с проблемами значений NULL, которые оказываются правильными. –

0

Несомненно. Вы можете использовать этот подход при отображении иерархий наследования с использованием подходаили Class Table Inheritance, см., Например, SQL Alchemy docs

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