Я работаю над созданием базы данных, которая будет использоваться для хранения данных, которые исходят из нескольких разных источников. Для экземпляров, которые я храню, назначаются уникальные идентификаторы исходными источниками. Каждый экземпляр, который я храню, должен содержать информацию об источнике, из которого он пришел, вместе с идентификатором, который был связан этим источником.Составной первичный ключ
В качестве примера, рассмотрим следующую таблицу, которая иллюстрирует проблему:
----------------------------------------------------------------
| source_id | id_on_source | data |
----------------------------------------------------------------
| 1 | 17600 | ... |
| 1 | 17601 | ... |
| 2 | 1 | ... |
| 3 | 1 | ... |
----------------------------------------------------------------
Обратите внимание, что в то время как id_on_source
является уникальным для каждого источника, можно за то же id_on_source
можно найти в различных источниках.
У меня есть хорошее понимание реляционных баз данных, но далеки от эксперта или даже опытного пользователя. Проблема, с которой я сталкиваюсь с этим дизайном, - это то, что я должен использовать в качестве первичного ключа. Кажется, что данные диктуют использование составного первичного ключа (source_id, id_on_source)
. После небольшого поиска в Google я нашел несколько ожесточенных дебатов о плюсах и минусах составных первичных ключей, но я немного смутился.
Таблица будет иметь отношения «один ко многим» с другими таблицами и поэтому будет упомянута в внешних ключах других таблиц.
Я не привязан к конкретному RDBMS
, и я не уверен, если это имеет значение для аргумента, но давайте скажем, что я предпочитаю работать с SQLite
и MySQL
.
Каковы преимущества и недостатки использования сложного внешнего ключа в этом случае? Что бы вы предпочли?
Подумайте о составной PK для хранения Эры и метки времени (1, 1970 ~ 2106) (2, 2106 ~ 2242). Поскольку INT8, INT16, INT32, INT64 основаны на двоичном и битовом размерах, у нас нет подходящего размера INT за год 9999. INT недостаточно, а BIG INT слишком велик. – Alix