Другие языки программирования и технологии

Какая концепция таблиц в БД MySQL лучше?

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

1 Вариант
Создаю отдельно таблицу для глобальных категорий и отдельно таблицу для подкатегорий. Столбцы будут с id и названиями.. . В таблице подкатегорий добавляю столб "принадлежность" и туда вписываю id глобальной категории для каждой отдельной подкатегории.

2 Вариант
Создаю одну таблицу для категорий и подкатегорий. Столбцы: id, title и принадлежность. У глобальных категорий в ячейке принадлежности будет к примеру стоять ноль (что как бы говорит о том что категория глобальная и самостоятельная) в то время как у подкатегорий в ячейке принадлежности будет стоять id глобальной категри, к которой она принадлежит.. .

Какой вариант лучше сделать? Я думая второй лучше т. к. запросы будут идти только к одной таблице тем самым снижая нагрузку на СУБД. Да и степеней вложенности категорий можно создать сколько угодно в то время как для первого варианта придется создавать новые таблицы для каждого нового уровня вложенности категорий.. . Прав ли я?
Иерархию одних и тех же данных всегда делают в одной таблице. Ведь на деле нет разницы куда ссылается строка таблицы. На строку другой таблицы или этой же. В то время как 2 таблицы с одним и тем же содержимым не нормально.

Касаемо нагрузки на СУБД.. . она зависит от особенностей работы СУБД а не от нагрузки на таблицы. Не надо серверу давать запрос который по вашему мнению выполнится быстрее. Киньте ему тупой запрос, и увидите как он отработает. Всё равно выполняется не запрос а план запроса. К тому же есть кэш запросов, может быть серверу вообще не придётся читать файлы с диска.
Байгарым Хасенов
Байгарым Хасенов
10 716
Лучший ответ
Не, рекурентные связи имеет смысл создавать только тогда, когда глубина дерева неизвестна. Если у тебя 2 уровня - делай 2 таблицы и не парься. И к тому же, обращений к ДВУМ таблицам ОДНОВРЕМЕННО (то есть джойнов) у тебя будет по минимуму. А БД пофиг - 2 обращения к разным таблицам или 2 обращения к одной и той же.
СК
Сергей К
55 933
во втором варианте ты только и выигрываешь на том что выборка будет делаться по одной таблице, безо всяких джоинов.. . и поскольку число категорий и подкатегорий будет оставаться вполне постоянной и малой величиной, то и ладушки.

другое дело если бы ты попытался слить в одну таблийцу категории и вопросы в этих категориях...)))
Делать полюбому 2й вариант. 1й вариант обеспечит только 2 уровня иерархии категорий. Плюс нет смысла елать отдельную таблицу для того же самого.

Что касается подкатегорий то делать надо FOREIGN KEY в эту же таблицу. Для корневых категорий устанавливать поле в NULL иначе потребуется фиктивная категория с индексом 0. При том что лучше делать ID категории типа IDENTITY(1,1).
Абсолютно прав. 2-й вариант лучший. Сделать колонку parent и писать туда id'шники главных категорий, а для главных категорий писать 0. И про вложенности тоже верно. Потом будет очень легко рекурсивно пробежатся от главной категории до самой низшей, или наоборот от низшей к главной.
Serenada
Serenada
1 562

Похожие вопросы