Могу ли я использовать одну часть моего первичного ключа в качестве внешнего ключа?
Я храню результаты некоторых симуляций в базе данных. Симуляция однозначно определяется его ExperimentID
, Каждое моделирование выполняется в течение определенного количества циклов моделирования, увеличиваемых с помощью CycleCount
, Итак, в цикле 0 мы получаем некоторые данные:
ExperimentID, CycleCount, data1, data2
0, 0, 100, 200
Затем в цикле 1 мы получаем больше данных:
ExperimentID, CycleCount, data1, data2
0, 0, 100, 200
0, 1, 150, 250
Так, data1
а также data2
находятся в своих собственных таблицах, чтобы убедиться, что база данных нормализована. Составной ключ здесь состоит из ExperimentID,CycleCount
, Могу ли я использовать CycleCount
установить отношения между data1
а также data2
используя его как внешний ключ? Есть ли другой способ сделать это?
2 ответа
Когда вы говорите "Симуляция уникально идентифицируется по ее ExperimentID", вы говорите, что есть таблица, которая называется "Эксперименты", где это поле является первичным ключом. В таблице имитаций это значение является внешним ключом таблицы экспериментов, но не может быть PK этой таблицы. Эта таблица содержит симуляции и может быть несколько симуляций для каждого эксперимента. Итак, да, комбинация (ExperimentID, CycleCount) делает превосходный PK для этой таблицы, если CycleCount уникален в каждом эксперименте.
Если CycleCount является просто возрастающим значением, тогда не имеет смысла считать его внешним ключом. Это будет просто ссылка на таблицу приращения значений, которая действительно ничего не добавляет к данным.
Однако, если каждый цикл имеет фиксированное значение, и вы можете создать таблицу следующим образом:
Cycle Name Meaning
0 Initial This is the initial reading taken before...
1 PreFlow This is the first reading taken after the proper flow rate is established...
2 MidFlow This is the second reading taken in the middle of the flow...
3 PostFlow This is the final reading taken after the flow has stopped...
тогда CycleCount как FK для этой таблицы будет иметь смысл. Он определяет домен CycleCount, поэтому вы не можете иметь значение 8 или 17 или что-либо, кроме 0..3, и предоставляет дополнительную информацию о каждом цикле, который вы, возможно, захотите показать в некоторых запросах.
Если такая таблица не нужна, вы должны явно ограничить домен проверочным ограничением в create table
заявление:
CycleCount tinyint check( CycleCount between 0..3 )
Определение в качестве части PK предотвратит использование повторяющихся значений для одного и того же эксперимента.
Я думаю, что это не очень хорошая нормализация. Учитывая, что у вас могут быть разные идентификаторы эксперимента, вы определенно не можете использовать CycleCount в качестве уникального идентификатора. Вам также следует рассказать нам о возможных других таблицах или подробностях того, что вы конкретно подразумеваете под "связью" между data1 и data2. Это также, возможно, лучше подходит для http://dba.stackexchange.com/