Хорошая практика сохранения свойств в реляционной базе данных

#mysql #sql #database #logic

#mysql #sql #База данных #Логические

Вопрос:

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

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

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

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

Решение 1

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

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

Решение 2

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

Таблица users :

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

Таблица can_program :

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

Ответ №1:

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

Ответ №2:

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

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

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

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

1. Спасибо. Как бы мне объединить эти таблицы, чтобы получить столбец ‘can_program’ и 1, если да, но 0, если нет?

2. Вы не объединяете их таким образом. Это один ко многим, так как в programmer_profiles есть какой-то user_id столбец, который ссылается обратно на users таблицу. Становится SELECT ... FROM users LEFT JOIN programmer_profiles ON users.id=programmer_profiles.user_id

3. Но предполагая, что мне нужно будет обрабатывать только тех пользователей, которые умеют программировать. Как бы я написал запрос, чтобы возвращать только такие свойства? Или мне нужно было бы проверить, равно ли is_teacher in programmer_profiles NULL или 1 ?

4. Вы можете использовать RIGHT JOIN для выбора только записей с соответствующими профилями. LEFT JOIN выбирает все записи и включает профили, если они присутствуют. Все реляционные базы данных основаны на реляционных данных, и это означает, что JOIN они сильно задействованы.