Делаю сервис вопросов и ответов наподобе этого (на котором вы сейчас находитесь) . Думаю как лучше расположить названия категорий и подкатегорий.. .
1 Вариант
Создаю отдельно таблицу для глобальных категорий и отдельно таблицу для подкатегорий. Столбцы будут с id и названиями.. . В таблице подкатегорий добавляю столб "принадлежность" и туда вписываю id глобальной категории для каждой отдельной подкатегории.
2 Вариант
Создаю одну таблицу для категорий и подкатегорий. Столбцы: id, title и принадлежность. У глобальных категорий в ячейке принадлежности будет к примеру стоять ноль (что как бы говорит о том что категория глобальная и самостоятельная) в то время как у подкатегорий в ячейке принадлежности будет стоять id глобальной категри, к которой она принадлежит.. .
Какой вариант лучше сделать? Я думая второй лучше т. к. запросы будут идти только к одной таблице тем самым снижая нагрузку на СУБД. Да и степеней вложенности категорий можно создать сколько угодно в то время как для первого варианта придется создавать новые таблицы для каждого нового уровня вложенности категорий.. . Прав ли я?
Другие языки программирования и технологии
Какая концепция таблиц в БД MySQL лучше?
Иерархию одних и тех же данных всегда делают в одной таблице. Ведь на деле нет разницы куда ссылается строка таблицы. На строку другой таблицы или этой же. В то время как 2 таблицы с одним и тем же содержимым не нормально.
Касаемо нагрузки на СУБД.. . она зависит от особенностей работы СУБД а не от нагрузки на таблицы. Не надо серверу давать запрос который по вашему мнению выполнится быстрее. Киньте ему тупой запрос, и увидите как он отработает. Всё равно выполняется не запрос а план запроса. К тому же есть кэш запросов, может быть серверу вообще не придётся читать файлы с диска.
Касаемо нагрузки на СУБД.. . она зависит от особенностей работы СУБД а не от нагрузки на таблицы. Не надо серверу давать запрос который по вашему мнению выполнится быстрее. Киньте ему тупой запрос, и увидите как он отработает. Всё равно выполняется не запрос а план запроса. К тому же есть кэш запросов, может быть серверу вообще не придётся читать файлы с диска.
Не, рекурентные связи имеет смысл создавать только тогда, когда глубина дерева неизвестна. Если у тебя 2 уровня - делай 2 таблицы и не парься. И к тому же, обращений к ДВУМ таблицам ОДНОВРЕМЕННО (то есть джойнов) у тебя будет по минимуму. А БД пофиг - 2 обращения к разным таблицам или 2 обращения к одной и той же.
во втором варианте ты только и выигрываешь на том что выборка будет делаться по одной таблице, безо всяких джоинов.. . и поскольку число категорий и подкатегорий будет оставаться вполне постоянной и малой величиной, то и ладушки.
другое дело если бы ты попытался слить в одну таблийцу категории и вопросы в этих категориях...)))
другое дело если бы ты попытался слить в одну таблийцу категории и вопросы в этих категориях...)))
Делать полюбому 2й вариант. 1й вариант обеспечит только 2 уровня иерархии категорий. Плюс нет смысла елать отдельную таблицу для того же самого.
Что касается подкатегорий то делать надо FOREIGN KEY в эту же таблицу. Для корневых категорий устанавливать поле в NULL иначе потребуется фиктивная категория с индексом 0. При том что лучше делать ID категории типа IDENTITY(1,1).
Что касается подкатегорий то делать надо FOREIGN KEY в эту же таблицу. Для корневых категорий устанавливать поле в NULL иначе потребуется фиктивная категория с индексом 0. При том что лучше делать ID категории типа IDENTITY(1,1).
Абсолютно прав. 2-й вариант лучший. Сделать колонку parent и писать туда id'шники главных категорий, а для главных категорий писать 0. И про вложенности тоже верно. Потом будет очень легко рекурсивно пробежатся от главной категории до самой низшей, или наоборот от низшей к главной.
Похожие вопросы
- Добрый день. Только начинаю осваивать с#. И вот возник вопрос. Как программно заполнить combobox из таблицы бд mysql?
- Нужна помощь в PHP програмировании с обращением к БД MySQL
- БД MySQL Что лучше? В одно поле запихнуть похожую информацию или создать много полей?
- Здравствуйте! Помогите изменить массово данные таблиц в mysql
- Подскажите как правильно сделать структуру БД? Говорят нужно несколько таблиц, а зачем?
- MySql и бд: Что такое умышленная денормализация и в каких случаях ее уместно применять?
- PHP+MySQL подскажите метод как задавать фотографии в БД если у одной строки (с одним ID) может быть несколько фотографий
- MySQL хостинг с внешним доступом в БД. Желательно не дорого. Hostinger не советуйте, были с ними проблемы уже.
- MySQL и PHP SELECT * FROM `users` Как вывести определенную информацию из графы БД, человека который сейчас авторизован
- SQL, MySQL, PgSQL, NoSQL, Redis Нужно ли для разных СУБД и БД какие-то разные версии языка SQL или она одна на всех?