База данных для мультиязычного дизайна. двойной уникальный ключ ссылается на внешний ключ
Я должен сделать так, чтобы моя база данных могла переводить некоторые термины. вот основная ничья моей базы данных:
Первая таблица (и еще многим нравится):
create table objects
id int PRIMARY KEY,
name varchar(50),
name_id int FOREIGN KEY,
Второй стол:
create table language
language varchar(20)
language_id PRIMARY KEY
Третий стол:
create table translations
language_id FOREIGN KEY,
name_id UNIQUE KEY,
translation varchar(50)
это выглядит так:
ОБЪЕКТЫ:
id | name | name_id
___|______|________
1 |apple |1
ЯЗЫК:
language_id | laguage
____________|________
1 | ENG
____________|________
2 | DEU
ПЕРЕВОДЫ:
language_id | name_id | translation
____________|_________|____________
1 | 1 | apple
____________|_________|____________
2 | 1 | apfel
Теперь оба столбца в переводах, language_id и name_id должны быть уникальными. но только один, name_id должен ссылаться на внешний ключ в табличных объектах.
это возможно сделать? если нет, какая альтернатива?
3 ответа
Это возможно, поскольку вы можете создать УНИКАЛЬНОЕ ограничение в большинстве баз данных:
-- Add unique constrain on two columns
ALTER TABLE TRANSLATIONS
ADD CONSTRAINT unq_translations UNIQUE (language_id, name_id);
-- Add foreign key constrain.
ALTER TABLE TRANSLATIONS
ADD CONSTRAINT fk_translations_name FOREIGN KEY (language_id, name_id) REFERENCES OBJECTS(language_id, id);
Используйте следующую альтернативу... Выполнить по порядку.
1. создать табличный объект (номер_объекта (10) первичный ключ, имя_объекта varchar (50));
2. создать таблицу языка (номер_языка (10) первичный ключ, имя_языка varchar (20));
3. создать перевод таблицы (номер_перемещения (10), первичный ключ, переводы varchar(50), номер_объекта (10), номер_языка (10), внешний ключ (object_id), ссылки на объект (object_id), внешний ключ (language_id), ссылки на язык (LANGUAGE_ID));
4. изменить перевод таблицы добавить уникальный (object_id, language_id);
Во-первых, в таблице ПЕРЕВОДЫ "name_id" УНИКАЛЬНО, я удивлен, как вы вставили дублирующую запись в этот столбец. Укажите правильные данные для третьей таблицы.
В таблице TRANSLATIONS name_id не должно содержать повторяющихся значений. Здесь только один столбец (с ограничением) в таблице TRANSLATIONS, который может содержать повторяющуюся запись, является LANGUAGE_ID, и не имеет смысла делать его уникальным, поскольку он уже уникален в своей родительской таблице LANGUAGE.
Однако, если вы сделаете столбец LANGUAGE_ID уникальным здесь, он будет разрешать только те номера записей, которые находятся в таблице LANGUAGE, т. Е. Если таблица LANGUAGE содержит 2 записи, вам будет разрешено вставить только 2 строки в таблицу TRANSLATIONS, поскольку я уже сказал нет выиграть от этого.