Первичным ключом этой таблицы может быть комбинация столбцов 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
.Таким образом, мы не дублируем никакие данные.