База данных для мультиязычного дизайна. двойной уникальный ключ ссылается на внешний ключ

Я должен сделать так, чтобы моя база данных могла переводить некоторые термины. вот основная ничья моей базы данных:

Первая таблица (и еще многим нравится):

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, поскольку я уже сказал нет выиграть от этого.

Другие вопросы по тегам