Хорошее решение для динамических категорий элементов в базе данных - PullRequest
1 голос
/ 13 марта 2012

Я собираюсь построить новую базу данных в MySQL и хочу иметь правильную цель с самого начала. У меня будет таблица с предметами, а затем я хочу отсортировать их по категориям. Моя проблема в том, что я хочу, чтобы категории были динамическими.

Если бы я знал категории, я бы построил это примерно так:

товар стол
ID
category1_id
category2_id
название

categories1 стол
ID
Название

categories2 стол
ID
Название

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

Ответы [ 3 ]

5 голосов
/ 13 марта 2012

Создайте три таблицы для этого ....

(1) tblItem:

  fields:
            itemId  (PK)
            itemName
            etc..

(2) tblКатегория:

  fields:
            categoryId  (PK)
            categoryName
            etc..

(3) tblItemCategory:

  fields:
            itemId  (FK)
            categoryId  (FK)
1 голос
/ 13 марта 2012

Я фанат использования одной таблицы "категорий" и наличия поля parent_id для ссылки на любую другую категорию в таблице.

Это позволяет вам иметь многопоточные категории в одной таблице ... ваши "Группы категорий" будут просто любой строкой категории, в которой нет данных в поле parent_id.

Пример данных

id    name          parent_id    category_count
1     appliances    null         1
2     dogs          null         1
3     couch         1            0
4     pitbull       2            0
5     games         null         0
//...

По сути, «Категория» связана с самим собой - вот модельные ассоциации: (ссылка: 3-й пример кода здесь в книге CakePHP )

class Category extends AppModel {

    public $belongsTo = array(
        'Parent' => array(
            'className' => 'Category',
            'foreignKey' => 'parent_id',
            'counterCache' => true
        )
    );

    public $hasMany = array(
        'Children' => array(
            'className' => 'Category',
            'foreignKey' => 'parent_id'
        )
    );

    //...
}

class Item extends AppModel {

    public $belongsTo = array('Category');

    //...

}

Вы также можете сделать Item hasAndBelongsToMany Category вместо belongsTo, если хотите - зависит только от вашей настройки.


Дополнительная информация:

CounterCache: Для получения дополнительной информации о counterCache CakePHP, перейдите сюда .

find-> резьбовое соединение: Используя этот метод, вы можете легко получить вложенные данные с помощью команды find-> резьбовое соединение CakePHP ( нажмите здесь для получения дополнительной информации об этом )

0 голосов
/ 13 марта 2012

Лучший способ - использовать отношения «многие ко многим»

Что-то вроде тахата:

**items**
id
title

**categories**
id
title

**items_categories**
item_id
category_id
...