Моделирование базы данных: лучший подход для нескольких категорий для нескольких элементов - PullRequest
3 голосов
/ 30 декабря 2011

Допустим, у меня есть 10 книг, каждой книге присвоено несколько категорий (например: php, программирование, кулинария, файлы cookie и т. Д.).

После сохранения этих данных в БД я хочу найти книги, соответствующие некоторым категориям, а также вывести соответствующие категории для каждой пары книг.

Что было бы лучшим подходом для быстрого и простого поиска кода:

1) Создайте столбец со всеми категориями для каждой книги, строки книги будут уникальными (категории, разделенные запятыми в каждой строке) -> денормализация от 1NF

2) Создайте столбец только с одной категорией в каждой строке и несколькими строками на книгу

Я думаю, что для других запросов будет проще, если я сохраню категории 1 на 1 (метод 2), но сложнее для этого конкретного типа поиска. Это правильно?

Я использую PHP и MySQL.

PPS: я знаю мульти-реляционный дизайн, я предпочитаю не присоединяться каждый раз к таблицам. Я использую другое соединение для некоторых таблиц, но это не проблема. Я спрашиваю, каков наилучший подход к дизайну БД для этого типа поиска: пользовательский тип кулинария, печенье, картофель и я хочу вывести пары книг, которые имеют еще 1,2 или все подходящие категории. Я ищу быстрый запрос или метод сопоставления php для этой вещи ... Скажите мне вашу точку зрения. Надеюсь, меня поняли

Ответы [ 4 ]

2 голосов
/ 30 декабря 2011

Используйте метод 2 - несколько строк на книгу, сохраняя одну категорию на строку. Это единственный способ облегчить поиск по данной категории.

Этот дизайн позволяет избежать повторяющихся групп в столбце , поэтому он подходит для первой нормальной формы.

Но это не просто учебное упражнение, это практический дизайн, который хорош для всех видов вещей. См. Мой ответ на Действительно ли плохо хранить список, разделенный запятыми, в столбце базы данных?

2 голосов
/ 30 декабря 2011

То, что вы хотите сделать, - это иметь одну таблицу для книг, одну таблицу для категорий и одну таблицу для соединения книг и категорий.Примерно так:

книги

book_id | title | etc

категории

category_id | title | etc

book_categories

book_id | category_id

Это называется отношением многих ко многим.Вам, вероятно, стоит поискать в Google, чтобы узнать больше.

1 голос
/ 30 декабря 2011

Это отношение «многие ко многим» (книга может иметь несколько категорий, а категория может использоваться в нескольких книгах).

Тогда имеем следующее:

Diagram

Понял?

=]

0 голосов
/ 30 декабря 2011

Я бы рекомендовал подход № 2. Это связано с тем, что для подхода 1 требуется полнотекстовый поиск по столбцу категории.

Вы можете добиться определенного успеха, разбив его на две таблицы: одна таблица содержит одну строку на книгу и уникальный идентификатор (вызовите таблицу books), а другая - одну строку на книгу на категорию и ссылается на книгу идентификатор из первой таблицы (вызов таблицы bookcategories). Тогда, если вам нужны только данные книги, вы используете таблицу books, где, если вам нужны категории, вы join обе таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...