Могу ли я использовать одну часть моего первичного ключа в качестве внешнего ключа?

Я храню результаты некоторых симуляций в базе данных. Симуляция однозначно определяется его 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/

Другие вопросы по тегам