2013-04-04 3 views
0

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

id1 id2 name1 name2 
10 1 a10  b1 
9 8 a11  b2 
8 3 a12  b3 
3 9 a14  b4 
1 10 a15  b5 

Так что, когда я создаю первичный ключ таблицы в

create table pk_table (id1 integer primary key , name1 varchar2(20)) 

и внешнего ключа таблицы, как

create table fk_table (id2 integer, name2 varchar2(20) foreign key(id2) references pk_table(id1)) 

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

pk_table данные:

id1 name1 
10 a10 
9 a11 
8 a12 
3 a14 
1 a15 

и внешнего ключа данные

id2 name2 
1 b1 
8 b2 
3 b3 
9 b4 
10 b5 

Так вы видели эти случаи, когда мы не имеем FK, относящиеся к той же строке рк в исходной таблице?

EDITED: Обновлены данные таблицы, чтобы сделать ее более достоверной.

+1

Просьба прочитать книгу Korth «Концепции системы баз данных». Также читайте все, что вы находите и понимаете в базах данных в ближайшие пару дней. Это не вопрос. Пожалуйста, уточните, с чем связана ваша проблема. – Rachcha

+0

'1, b1' абсолютно ** должен ** существовать в' fk_table'. Вы не изменили записи из исходной таблицы правильно, если она не существует. Что означает '10, a10', если это не так? Кроме того, при создании таблицы 'fk_table' вы все равно должны идентифицировать' id2' как первичный ключ, так как это первичный ключ для этой таблицы. – mcalex

+0

Если FK не ссылается на какой-либо ПК, то это не сам FK. – Santhosh

ответ

0

Способ разделения таблиц не соответствует критериям нормализации. Между полями в исходной таблице нет (видимой) функциональной зависимости. Во-вторых, ваши таблицы даже не имеют отношения PK-FK. Ваш вопрос бессмыслен, потому что ваше предположение о том, что вы разделили таблицы с PK-FK, неверно.

+0

Я не нормализую свой стол. Я создаю несколько таблиц из одной существующей таблицы. Так что вопрос действительно – peeyush

+0

Мой ответ верный. Ясно, что вы не понимаете концепций ПК-ФК, что само по себе не является проблемой, но ваш ум закрыт, чтобы пересмотреть ваши (сломанные) предположения. Если вы утверждаете, что не нормализуетесь, вы не должны спрашивать о недостатках строк PK-FK. Если вы хотите прогрессировать, укажите PK в каждой таблице для стартеров. – koriander

+0

@koriander +1 за то, что вы были правы (и выбивать незаслуженную нисходящую), но мог бы я, мягко говоря, хотя и с некоторой иронией предположить, что, очевидно, вы не понимаете, как ответы высокого уровня на явно вопросы начального уровня могут не привести к удовлетворению от точка зрения кверта? – mcalex

2

Во-первых, чтобы ответить на этот вопрос вы задали:

Да, вы видите данные в разных строках, когда вы разбили одну таблицу на две (или более). Вот как дела: ™. Неважно, какая строка в таблице была исходной, или новые данные. Номер строки имеет ничего, чтобы сделать с вашими данными, то есть как он отображает себя. Например, вы могли бы создать новый pk_table так:

id1 name1 
1 a15 
3 a14 
8 a12 
9 a11 
10 a10 

и это не будет иметь никакого значения.

Во-вторых, и это касается того, что другие люди пытаются вам рассказать. То, как вы преобразовали исходную таблицу в две вторичные таблицы , не будет предоставить вам базу данных. Синтаксис, который вы поставили для создания fk_table a), не имеет смысла, и b) не будет работать.

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

Для практического смысла в этом, новые таблицы должны выглядеть немного больше, как это:

pk_table - id1 первичный ключ:

id1 name1 
10 a10 
9 a11 
8 a12 
3 a14 
1 a15 

fk_table - id2 является первичным ключом, fk_id1 является внешним ключом к pk_table:

id2 name2 fk_id1 
1 b1  10 
8 b2  9 
3 b3  8 
9 b4  3 
10 b5  1 

с этой структурой можно запускать запросы я по желанию правильно соединить каждую pk_table запись fk_table запись (-ы)

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