Разрабатываемый мной проект (REST API) разбит на множество модулей. Каждый модуль хранит данные в своей БД. БД некоторых модулей могут содержать таблицы, ссылающиеся на данные других модулей.
Проект должен поддерживать множество языков. Новые языки могут быть добавлены в любое время.
Я выбрал следующую структуру для хранения переводимых сущностей:
CREATE TABLE languages
(
id UUID NOT NULL PRIMARY KEY,
code CHAR(2) NOT NULL,
name TEXT NOT NULL
);
CREATE UNIQUE INDEX languages_code_uindex ON languages (code);
CREATE TABLE countries
(
id UUID NOT NULL PRIMARY KEY,
some_property INT
);
CREATE TABLE country_translations
(
country_id UUID NOT NULL,
language_id UUID NOT NULL,
name TEXT NOT NULL,
CONSTRAINT country_translations__pk PRIMARY KEY (language_id, country_id)
);
У меня есть несколько вопросов:
- Я использую UUID в качестве PK для всех таблиц. Хорошо ли это?
Я выбрал UUID, т.к. в коде REST API использую подход CQRS. Команды не могут возвращать никаких данных => я не могу вернуть Id созданной записи. Поэтому я генерю Guid и передаю его в команду, после чего могу этот Guid вернуть пользователю.
- Стоит ли изменить PK у таблицы languages на char(2)? В поле code будет содержаться код языка (ISO-639-1). Этот код будет уникальным -> его можно сделать PK для таблицы Languages.