Мне всегда трудно иметь дело с нормализованными данными и способами их отображения. Возможно, потому, что я не совсем понимаю правила нормализации, например, как полностью включить его в Бойс-Кодд. На данном этапе производительность не является проблемой, хотя ремонтопригодность схемы снижается.
Пользователь
ID Name
1 Alice
2 Bob
3 Charlie
навыки
ID Name
1 Karate
2 Marksmen
3 Cook
событие
ID Name
1 Island
2 Volcano
пользователь-M2M-умение
MemberID SkillID
1 1
1 2
2 1
2 3
3 1
пользователь M2M-событие
MemberID EventID
1 1
1 2
2 1
3 2
Как мне получить эту информацию из базы данных? Я хотел бы отобразить такую таблицу, где у меня есть общее количество каждого навыка:
Навыки на событии
Event Karate Marksmen Cook
Island 2 1 1
Volcano 2 1 0
Маловероятно, что таблица навыков сильно изменится. Это означает, что я мог бы сделать такой набор подзапросов (очевидно, сокращенный и неправильный синтаксис)
SELECT event.name,
(SELECT COUNT(*) FROM ... WHERE skill = 'Karate'),
(SELECT COUNT(*) FROM ... WHERE skill = 'Marksmen') FROM event
И это то, чем я занимаюсь, ставлю это в поле зрения. Но это немного ужасно, нет? Мне приходится редактировать вид каждый раз, когда я добавляю новый навык.
Другой способ обработать его на стороне клиента. Так что я просто возвращаюсь примерно так:
Event Skill Count
Island Karate 2
Island Marksmen 1
Island Cook 1
Volcano Karate 2
Volcano Marksmen 1
И я перебираю результаты, переформатируя их. Но я ненавижу это еще больше. Разве база данных не должна делать данные?
Итак: что я делаю не так? Я ожидаю слишком многого? Какое меньшее зло?
(Как сказал бы b3ta, извиняюсь за длину поста и за плохую разметку. :()