0

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

branch_id 
branch_manager 
branch_location 

Данные в этой таблице будет выглядеть так:

1 Mr. John Doe  Manhattan 
2 Miss. Jane Doe Utah 
3 Mr. Random Guy Somewhere 

Существует еще одна таблица под названием services, в которой хранятся все служебные данные. Поля:

service_id 
service_name 

данные будут, как:

1 New Sales 
2 After-Sales Support 
3 Replacement 
4 Exchange Offer 

Теперь я хочу, чтобы хранить услуги, доступные в каждой отрасли. Обычно я предполагаю, что это сделано, создав новую таблицу под названием branch_services, которая будет содержать branch_id и service_id. Так что, если я следующая запись в branch_services

branch-id service-id 
1   2 
1   3 
2   1 

Это означает, что отрасль Manhattan делает послепродажное обслуживание и замен, в то время как филиал Utah делает только новые продажи.

Теперь мой вопрос: вместо таблицы branch_services, что делать, если я сохранил список служб, разделенных запятыми, в самой таблице ветвей?

1 Mr. John Doe  Manhattan 2,3 
2 Miss. Jane Doe Utah   1 
3 Mr. Random Guy Somewhere 

Каковы основные аргументы против этого? Являются ли эти запросы более сложными/медленными для выполнения (например, если бы я хотел видеть, какие все ветви выполняли конкретную службу)? Есть ли какое-либо преимущество, структурируя его запятыми?

ответ

1

Вы можете хранить свои данные так, как вам нравится (т. Е. Вы можете иметь свои текстовые поля на кириллице), но вы также должны учитывать, что хотите делать с вашими данными (то есть вы хотите хранить английские слова и вы и ваши коллеги не знаете кириллицу).

Если вы работаете с реляционной базой данных, я подозреваю, что вы собираетесь использовать SQL. Теперь я могу написать запрос, как:

select b.branch_location, 
     s.service_name 
    from branch b 
inner join branch_services b_s 
     on b.branch_id = b_s.branch_id 
inner join services s 
     on b_s.service_id = s.service_id 

Для получения:

branch_location service_name 
Manhattan  After-Sales Support 
Manhattan  Replacement 
Utah   New Sales 

Поскольку SQL предназначен для запроса RDMS и в нашем случае отношения между содержанием колонн branch_id в branch и branch_services (или service_id в branch_services и services).

Конечно, мы можем понять, что 2,3 означает то же самое, что 2 и 3 в двух разных строках, но SQL не в состоянии это понять. [На самом деле мы делаем разбить строку 2,3 на два значения и сопоставить каждую из них в строке в таблицах services. Не так просто сделать это в чистом SQL.]

Ваш вопрос о производительности, прежде чем попасть туда, реальный вопрос: «Могу ли я запросить такую ​​структуру с помощью SQL?» Да и нет.

Если получить список филиалов и служб, как и мой запрос выше, может быть довольно сложным, чтобы получить ветку, которая выполняет определенную услугу, по-прежнему выполнима, в конце концов, если нужно проверить, кто делает New Sales, вам нужно только посмотрите, есть ли в вашем списке услуг 1, но исключают все 10, 11, 12 и так далее. Ух ... не так прямо.

Что я пытаюсь вам показать, так это то, что структура трех таблиц более гибкая, если вам нужно использовать ее с SQL, а не с человеческим мозгом. К сожалению, компьютеры еще не настолько умны.

Итак:

Можно ли хранить данные, разделенных запятыми в колонке? Да.

Это хорошая идея? Обычно Нет, если вы хотите использовать его в отношениях с другой таблицей.

Обычно? Если им нужно просто выставить длинную запятую, то да.

+0

У меня был только один ответ на этот вопрос, но это было самое лучшее! большое спасибо!! –

+0

Я старался изо всех сил, реляционные базы данных иногда следуют за вызывающей логикой. Сохраните дизайн и ваши запросы так же просто, как вы можете – mucio

+0

См. [Этот ответ] (https://stackoverflow.com/a/24130834/3404097). – philipxy

Смежные вопросы