#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
inprogrammer_profiles
NULL
или1
?4. Вы можете использовать
RIGHT JOIN
для выбора только записей с соответствующими профилями.LEFT JOIN
выбирает все записи и включает профили, если они присутствуют. Все реляционные базы данных основаны на реляционных данных, и это означает, чтоJOIN
они сильно задействованы.