Проблема с разработкой доски объявлений

Здравствуйте. Поставлена задача разработать сервис для доски объявлений с множеством сортировок.
После вечернего обдумывания структуры БД пришёл в ступор: не могу понять механизм сортировок. Суть проста: есть велосипеды. У велосипедов есть марки, в зависимости от марки велосипед имеет разное количество скоростей. Продумал варианты, в голову пришла только одна мысль - создание таблиц для каждой глобальной категории (Транспорт -> Велосипеды). Есть ли другие оптимальные решения данной задачи? Заранее благодарю.
  • Вопрос задан
  • 2855 просмотров
Решения вопроса 1
shaks
@shaks
Советую глянуть в сторону NoSQL решений, например MongoDB.
А по поводу mysql щас подумаю, чуть позже отпишу.

** подумал..
4 таблицы:
items - товары
categories - список категорий (под-категории не учитываю для простоты изъяснения)
options - характеристики товаров (связь один ко многим)
items_categories - категории товаров (связь один ко многим)

Суть вот в чем, у каждого товара может быть ноль или много характеристик. Характеристики имеют ключ и значение, значение может быть типа integer или varchar. В этом заключается проблема, не знаю как её можно решить изящно. Как вариант делать два поля string_value и int_value с соответствующим типом. А при поиске выбирать поле по типу искомого.

items_categories содержит в себе поля category_id и item_id, таким образом список категорий того или иного товара достигается элементарным запросом с inner join

Пример выборки категорий товара
SELECT `categories`.* FROM `categories` INNER JOIN `items_categories` ON `categories`.`id` = `items_categories`.`category_id` WHERE `items_categories`.`item_id` = 123


Пример выборки товара с его характеристиками
SELECT `items`.* , `options`.* FROM `items`, `options` WHERE `items`.`id` = 123 AND `options`.`item_id` = `items`.`id`


В общем как-то так..
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
0neS
@0neS
Я бы сделал вот так:

CREATE TABLE IF NOT EXISTS `category` (
    `id` int unsigned not null AUTO_INCREMENT,
    `name` varchar(256) not null,
    `parent_id` int unsigned,
    PRIMARY KEY (`id`),
    UNIQUE KEY (`name`, `parent_id`),
    CONSTRAINT `category_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `category` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB;

INSERT INTO `category` (`id`, `title`, `parent_id`) VALUES
    (1, 'Бытовая техника', null),
    (2, 'Стиральные машины', 1),
    (3, 'Пылесосы', 1),
    (4, 'Холодильники', 1),
    (5, 'Транспорт', null),
    (6, 'Автомобили', 5),
    (7 'Мотоциклы', 5),
    (8,'Катеры', 5),
    (9, 'Велосипеды', 5);

CREATE TABLE IF NOT EXISTS `model` (
    `id` int unsigned not null AUTO_INCREMENT,
    `name` varchar(256) not null,
    PRIMARY KEY (`id`),
    UNIQUE KEY (`name`)
) ENGINE=InnoDB;

INSERT INTO `model` (`id`, `name`) VALUES
    (1, 'Аист'),
    (2, 'Орленок'),
    (3, 'Дружок'),
    (4, 'Спутник'),
    (5, 'Десна'),
    (6, 'Салют'),
    (7, 'STELS');

CREATE TABLE IF NOT EXISTS `attribute` (
    `id` int unsigned not null AUTO_INCREMENT,
    `name` varchar(256) not null,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB;

INSERT INTO `attribute` (`name`) VALUES
    ('Кол-во скоростей');

CREATE TABLE IF NOT EXISTS `model_attribute` (
    `model_id` int unsigned not null,
    `attribute_id` int unsigned not null,
    `value_int` int,
    `value_var` varchar(4096),
    PRIMARY KEY (`advert_id`, `attribute_id`),
    CONSTRAINT `model_attribute_ibfk_1` FOREIGN KEY (`model_id`) REFERENCES `model` (`id`) ON DELETE CASCADE,
    CONSTRAINT `model_attribute_ibfk_2` FOREIGN KEY (`attribute_id`) REFERENCES `attribute` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB;

INSERT INTO `model_attribute` (`model_id`, `attribute_id`, `value_int`, `value_var`) VALUES
    (1, 1, 1, null),
    (2, 1, 1, null),
    (3, 1, 1, null),
    (4, 1, 1, null),
    (5, 1, 1, null),
    (6, 1, 1, null),
    (7, 1, 21, null);

CREATE TABLE IF NOT EXISTS `advert` (
    `id` int unsigned not null AUTO_INCREMENT,
    `title` varchar(256) not null,
    `text` varchar(2048) not null,
    `category_id` int unsigned not null,
    `model_id` int unsigned,
    PRIMARY KEY (`id`),
    CONSTRAINT `advert_ibfk_1` FOREIGN KEY (`category_id`) REFERENCES `category` (`id`) ON DELETE CASCADE,
    CONSTRAINT `advert_ibfk_2` FOREIGN KEY (`model_id`) REFERENCES `model` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB;

INSERT INTO `advert` (`id`, `title`, `text`, `category_id`, `model_id`) VALUES
    (1, '...', '...', 9, 7),
    (2, '...', '...', 9, 4);


Точно такую же таблицу model_attribute при необходимости можно создать и для категорий.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
Бюро Цифровых Технологий Санкт-Петербург
от 120 000 до 180 000 ₽
07 мая 2024, в 11:27
1500 руб./в час
07 мая 2024, в 11:18
50000 руб./за проект
07 мая 2024, в 11:02
300 руб./за проект