Архитектура MySQL: пустые столбцы и объединения - PullRequest
2 голосов
/ 20 апреля 2009

У меня есть приложение, в котором я буду повторять события. Таким образом, событие может повторяться по дням, «каждые n дней», по неделям, «каждые n недель в понедельник / вторник / среду / и т. Д.» И по месяцам «каждые n месяцев 1-го, 2-го, 3-го и т. Д.».

Каков наилучший способ справиться с этим с точки зрения дизайна стола? Я могу придумать два пути, но я не уверен, какой из них лучше.

1) 5 столбцов для вышеперечисленных, 1 для дневного случая и 2 для недели и месяца. То, что не используется, будет нулевым. В моем приложении я мог видеть нулевые значения и игнорировать их.

2) Иметь вторую таблицу, скажем events_dateinfo или что-то подобное, к которому я бы присоединился для запроса.

Похоже, что вариант 2, вероятно, более «нормализован», а что нет, но кажется ли вам излишним перебор для такой простой вещи? Кроме того, если бы я выбрал вариант 2, есть ли способ перевести строки в столбцы, то есть выбрать атрибуты 2 недели для определенного события и обработать их как столбцы?

Ответы [ 2 ]

1 голос
/ 21 апреля 2009

Если я правильно понял, событие может иметь более 1 графика (вот почему вы хотите «преобразовать строки в столбцы»).

В этом случае вам понадобятся не 2, а 3 таблицы; третий должен быть соединительным столом. Вы можете легко добавить новые графики, если вам нужно в будущем с этой схемой. Итак, как то так:

table events (event_id, event_name, description)
table schedules (sch_id, schedule)
table event_schedule (event_id, sch_id)

Насколько мне известно, в MySQL нет возможности PIVOT, но вы можете использовать функцию GROUP_CONCAT () в SELECT; это будет одна строка для каждого события, и все расписания для одного события будут в одном столбце.

SELECT e.event_name AS Event, GROUP_CONCAT( s.schedule SEPARATOR ', ') AS Schedule
         FROM events e 
    (LEFT) JOIN event_schedule es
    ON e.event_id = es.event_id
    JOIN schedules s
    ON s.sch_id = es. sch_id
         GROUP BY e.event_name;
0 голосов
/ 20 апреля 2009

Я бы предпочел обработать этот normallized, События в одной таблице и повторяемость событий в другой.

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

...