Логические атрибуты базы данных или FK в таблицу определений?

#database #data-modeling

#База данных #моделирование данных

Вопрос:

В рассмотренном мною устаревшем коде я нашел модель данных, которая создает логические поля соответствующих атрибутов, где ожидается, что только один из них будет истинным. Например:

 create table MyTable (
   id int primary key not null,
   // more fields...
   has_x bool not null,
   has_y bool not null
);
  

Это глупо, потому что это допускает потенциально противоречивые данные, если для обоих установлено значение true. Я пытаюсь объяснить техническим пользователям, но не являющимся разработчиками, но не уверен, как объяснить, ПОЧЕМУ правильно менять отношение «1 ко многим» к определению, как показано ниже, когда оригинальный дизайн «работает».

 create table Attributes ( -- contains "x" and "y" records.
   id int primary key not null,
   name varchar(100) not null
);

create table MyTable (
   id int primary key not null,
   // more fields
   attribute_id int not null foreign key references Attributes(id)
);
  

Есть ли термин для этих шаблонов моделирования данных?

Ответ №1:

Вы думаете о нормализации базы данных.

Однако вы можете обеспечить согласованность, внедрив CHECK ограничение, которое позволит в любой момент времени устанавливать значение true только для одного из логических полей.

Комментарии:

1. Внешний ключ обеспечивает только одно значение true из-за ограничения NOT NULL и таблицы атрибутов, содержащей записи для каждой возможности. Отношение «многие ко многим» в этом примере нежелательно.

2. np. Вы указали термин, который, кажется, соответствует этой ситуации. Спасибо!