Как вы обнаружили, MyISAM не поддерживает внешние ключи.И users
, и userSettings
должны быть InnoDB.
[Мне] просто любопытно, если использование UNIQUE_KEY и FOREIGN_KEY в одном столбце является хорошей практикой
Это означает, что таблица userSettings
может содержать не более одной строки для каждого userId
.Я предполагаю, что вам нужна только одна строка на userId, потому что вы храните «массив» настроек, закодированных как-то в вашем столбце settingsArray TEXT
. Это не очень хорошая практика.
Вы должны либо сохранить каждый параметр в своем собственном столбце:
CREATE TABLE `userSettings` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`userId` int(11) unsigned NOT NULL,
`isAdmin` bool NOT NULL,
`timezone` varchar(10) NOT NULL,
`theme` varchar(10) NOT NULL,
...other settings...
PRIMARY KEY (`id`),
UNIQUE KEY `uk_userId` (`userId`),
KEY `fk_userSettings_userId` (`userId`)
)
Или же сохранить несколько строк на userId
, содно имя параметра и значение для строки.
CREATE TABLE `userSettings` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`userId` int(11) unsigned NOT NULL,
`setting` varchar(20) NOT NULL,
`value` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_userId` (`userId`,`setting`),
KEY `fk_userSettings_userId` (`userId`)
)
Также удивительно, почему вам нужен столбец id
для первичного ключа, если userId
уже НЕ НЕДЕЙСТВИТЕЛЕН и УНИКАЛЬЕН, и это, вероятно, ключв любом случае вы будете искать строки.Вы можете также сделать userId
ПЕРВИЧНЫЙ КЛЮЧ (или userId, setting
во втором примере) и опустить столбец id
.