Хорошая практика по сохранению свойств в реляционной базе данных - PullRequest
0 голосов
/ 19 марта 2019

Давайте предположим, что в моей системе есть два типа пользователей.

Те, кто может программировать, и те, кто не может.

Мне нужно сохранить оба типа пользователей в одной таблице.Пользователи, которые могут программировать, имеют множество свойств, отличных от тех, которые не могут, определенных в другой таблице.

В чем преимущества следующих решений и есть ли лучшие решения?

Решение 1

Одна таблица, содержащая столбец с соответствующим свойством.

Table `users`:
----------------------------
| id | name  | can_program |
----------------------------
| 1  | Karl  | 1           |
| 2  | Ally  | 0           |
| 3  | Blake | 1           |
----------------------------

Решение 2

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

Таблица users:

--------------
| id | name  | 
--------------
| 1  | Karl  |
| 2  | Ally  |
| 3  | Blake |
--------------

Таблица can_program:

---------------------
| id | can_program  | 
---------------------
| 1  | 1            |
| 3  | 1            |
---------------------

Ответы [ 2 ]

2 голосов
/ 19 марта 2019

У вас есть отношения 1-1 между пользователем и свойством, которое позволяет ему программировать. Я бы рекомендовал хранить эту информацию в качестве дополнительного столбца в таблице users. Создание дополнительной таблицы в основном приводит к созданию дополнительной структуры хранения с отношением 1-1 к исходной таблице.

1 голос
/ 19 марта 2019

Почему бы просто не иметь какую-то таблицу programmer_profiles, с которой у таблицы users есть отношение один ко многим?

Если в programmer_profiles есть связанная запись, то они могут программировать, иначе предполагается, что они не могут.

Это более гибко, поскольку вы можете добавлять другие таблицы x_profiles, которые предоставляют разные свойства, даже если некоторые из них имеют одинаковые имена.

...