Могут ли несколько столбцов считаться одним объединенным первичным ключом? - PullRequest
0 голосов
/ 15 сентября 2018

Там есть деревня, где жители посещают несколько домов. Я хочу сохранить, какой сельский житель посещает какой дом и как часто он посещает его. Я решил создать таблицу следующим образом:

CREATE TABLE 'visitis'('villager' TEXT NOT NULL, 'house' INTEGER NOT NULL, 'amount' INTEGER NOT NULL DEFAULT 0);

Таблица хранится следующим образом;

  • villager хранит имя деревенского жителя. Каждый сельский житель имеет уникальное имя.
  • house - это адрес дома. Это целое число.
  • amount хранит информацию о том, сколько раз этот сельский житель посещал этот дом.

Эта таблица не содержит первичного ключа и поэтому, как я считаю, не оптимальна. И количество жителей, и количество домов не определено до уровня, при котором более неэффективно хранить жителей или дома в виде столбца.

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

  1. Большинство жителей деревни посетят несколько домов. Однако эта сумма относительно невелика и может быть ниже 50 домов;
  2. Есть много домов (целых чисел), которые не будут посещены. Тем не менее, дома, которые посещены , часто посещают до 10 жителей деревни;
  3. Сельские жители посетят ограниченное количество домов, но немногие посетят более 1000 домов;
  4. Важно запомнить, как часто какой житель посещал какой дом;
  5. Данные часто должны быть доступны как по имени деревенского жителя, так и по адресу дома;
  6. Как дома, так и сельские жители могут стать очень высокими.

Возможно, мне не хватает чего-то очевидного. Я ...?

1 Ответ

0 голосов
/ 15 сентября 2018

Первичным ключом этой таблицы может быть комбинация столбцов villager и house.У SQLite нет проблем с первичным ключом, состоящим из более чем одного столбца:

CREATE TABLE visitis (
    villager TEXT NOT NULL,
    house INTEGER NOT NULL,
    amount INTEGER NOT NULL DEFAULT 0,
    PRIMARY KEY (villager, house)
);

Логическая причина этого заключается в том, что определенный сельский житель, посещающий данный дом, должен быть представлен только одной записью.Столбец amount обрабатывает случай, когда может быть более одного посещения.

Но хотя это решает вашу непосредственную проблему, это не идеально, потому что ваша таблица не нормализована.Таблица visitis - это то, что обычно называют соединительной таблицей, поскольку она каким-то осмысленным образом связывает две другие таблицы.Вот лучший дизайн:

CREATE TABLE visitis (
    villager_id INTEGER NOT NULL,
    house_id INTEGER NOT NULL,
    amount INTEGER NOT NULL DEFAULT 0,
    PRIMARY KEY (villager_id, house_id),
    FOREIGN KEY (villager_id) REFERENCES villages (id),
    FOREIGN KEY (house_id) REFERENCES houses (id)
);

Теперь мы сохраняем только пары внешних ключей, каждый из которых указывает на запись в таблице villages или houses.Таким образом, мы не дублируем никакие данные.

...