powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / варианты спроектировать категории
25 сообщений из 33, страница 1 из 2
варианты спроектировать категории
    #35414547
Потап_mmm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
добрый день.
есть стандартная задача организации товаров в магазине.

категория
подкатегория
продукт

условия:
1. продукт может находится в одной или нескольких категориях
2. продукт может иметь либо не иметь подкатегорию

сделал четыре таблицы с такой связью:

1 продукты --> productID categoryID subcategoryID
2 подкатегории --> subcategoryID categoryID
3 категории --> categoryID
4 продукты_категории --> productID categoryID // для связи многие комногим

вопрос есть ли более правильные варианты спроектировать эту схему ?
...
Рейтинг: 0 / 0
варианты спроектировать категории
    #35414584
Naf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему один и тот же товар попадает в две подкатегории?
С уважением, Naf
...
Рейтинг: 0 / 0
варианты спроектировать категории
    #35414587
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оба условия, имхо, вредные, постарайтесь избавиться от них.
От второго избавиться легко - просто завести категорию "разное".

PS. Вроде для курсовиков не сезон, но очень на таковой похоже...
...
Рейтинг: 0 / 0
варианты спроектировать категории
    #35414618
Потап_mmm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
NafПочему один и тот же товар попадает в две подкатегории?
С уважением, Naf
странний вопрос
к примеру фильм может быть и комедия и боевик
...
Рейтинг: 0 / 0
варианты спроектировать категории
    #35414636
Потап_mmm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoftОба условия, имхо, вредные, постарайтесь избавиться от них.
От второго избавиться легко - просто завести категорию "разное".

PS. Вроде для курсовиков не сезон, но очень на таковой похоже...
клиент так хотел
ps: я больше серверный програмер
...
Рейтинг: 0 / 0
варианты спроектировать категории
    #35414667
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Потап_mmm miksoftОба условия, имхо, вредные, постарайтесь избавиться от них.
От второго избавиться легко - просто завести категорию "разное".

PS. Вроде для курсовиков не сезон, но очень на таковой похоже...клиент так хотелТогда сначала разберитесь, как будут действовать в таких условиях бизнес-правила, привязанные к категории товара.
Например, как быть, если клиент захочет, чтобы одной категорией товаров занимался один менеджер, а другой категорией - другой менеджер?
Как раскладывать разные категории по разным витринам?
Как быть с тем, что сумма продаж по категориям не сходится с общей суммой продаж?

Кстати, клиент уверен, что иерархии всего из двух уровней будет достаточно на много лет вперед?
...
Рейтинг: 0 / 0
варианты спроектировать категории
    #35414711
Потап_mmm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вот потому что я над этим задумался тут и написал а не от скуки
miksoft
Например, как быть, если клиент захочет, чтобы одной категорией товаров занимался один менеджер, а другой категорией - другой менеджер?

в этом проблемы невижу, таблица менеджер_категория
miksoft
Как раскладывать разные категории по разным витринам?

тоже самое
...
Рейтинг: 0 / 0
варианты спроектировать категории
    #35414722
Naf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так как же их распределить, если он входит в две категории? оба менеджера его обслуживают? лежит в разных отделах? Конфликт получаем..
С уважением, Naf
...
Рейтинг: 0 / 0
варианты спроектировать категории
    #35414726
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Потап_mmmвот потому что я над этим задумался тут и написал а не от скукиТак это у клиента надо выяснять, а не у нас. Откуда мы знаем что у него и как?
Потап_mmm miksoft
Например, как быть, если клиент захочет, чтобы одной категорией товаров занимался один менеджер, а другой категорией - другой менеджер?
в этом проблемы невижу, таблица менеджер_категорияЕсли один товар принадлежит сразу двум категориям, то кто должен им заниматься - менеджер первой категории или менеджер второй? или сразу оба?
...
Рейтинг: 0 / 0
варианты спроектировать категории
    #35414800
Потап_mmm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft Потап_mmmвот потому что я над этим задумался тут и написал а не от скукиТак это у клиента надо выяснять, а не у нас. Откуда мы знаем что у него и как?
Потап_mmm miksoft
Например, как быть, если клиент захочет, чтобы одной категорией товаров занимался один менеджер, а другой категорией - другой менеджер?
в этом проблемы невижу, таблица менеджер_категорияЕсли один товар принадлежит сразу двум категориям, то кто должен им заниматься - менеджер первой категории или менеджер второй? или сразу оба?
думаю сделать в продуктах одну категорию основной и связку через left join с таблицей продукты_категории
...
Рейтинг: 0 / 0
варианты спроектировать категории
    #35415023
nosov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
пример :
разбиваем овощи на категории
1. капуста
2. свекла
3. огурцы
4. помидоры
5. картофель и т.д.
и какая тут категория основная ???
не бывает основных категорий в базах данных (имхо)
...
Рейтинг: 0 / 0
варианты спроектировать категории
    #35415044
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nosovне бывает основных категорий в базах данных (имхо)Категория основная вполне может быть. Например, руководство по ремонту автомобиля может иметь основной категорией "Литература", а дополнительной категорией "Товары для автолюбителей". Признак отношения категория-товар может храниться,например, в таблице-связке между категориями и товаром.

Но в конкретном обсуждаемом случае, если уж возникло понятие "основная категория", возникает вопрос, а нужны ли неосновные категории? Какие бизнес-правила будут их учитывать и как?
...
Рейтинг: 0 / 0
варианты спроектировать категории
    #35415127
VinKS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1 категории --> Categories - categoryID, leftKey, rightKey (гуглим Nested Sets)
2 продукты --> Products - productID
3 продукты_категории --> productID categoryID

Самая оптимальная нормализованная схема
...
Рейтинг: 0 / 0
варианты спроектировать категории
    #35416313
Чорный Бада
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне кажется, что требования сформулированны неточно. Подозреваю, что имелось в виду: "Продукт должен принадлежать одной или более категории, и, для каждой категории, которой он принадлежит , принадлежать нулю или одной её подкатегории". Во избежание костыльных переделок в будущем, советовал бы уточнить у заказчика требования :-)
...
Рейтинг: 0 / 0
варианты спроектировать категории
    #35416862
Потап_mmm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
nosovпример :
разбиваем овощи на категории
1. капуста
2. свекла
3. огурцы
4. помидоры
5. картофель и т.д.
и какая тут категория основная ???
не бывает основных категорий в базах данных (имхо)
нельзя же косить все базы под одну схему
...
Рейтинг: 0 / 0
варианты спроектировать категории
    #35416869
Потап_mmm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VinKS1 категории --> Categories - categoryID, leftKey, rightKey (гуглим Nested Sets)
2 продукты --> Products - productID
3 продукты_категории --> productID categoryID

Самая оптимальная нормализованная схема
деревья помоему несовсем то
...
Рейтинг: 0 / 0
варианты спроектировать категории
    #35416872
Потап_mmm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Чорный БадаМне кажется, что требования сформулированны неточно. Подозреваю, что имелось в виду: "Продукт должен принадлежать одной или более категории, и, для каждой категории, которой он принадлежит , принадлежать нулю или одной её подкатегории". Во избежание костыльных переделок в будущем, советовал бы уточнить у заказчика требования :-)
скажм так точнее, ещё схему предложите )
...
Рейтинг: 0 / 0
варианты спроектировать категории
    #35417704
VinKS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автордеревья помоему несовсем то

Да храните категории по какому угодно принципу, можно и в Adjacency List, суть от этого совершенно не поменяется
...
Рейтинг: 0 / 0
варианты спроектировать категории
    #35418643
Чорный Бада
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Потап_mmmскажм так точнее, ещё схему предложите )
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
create table Product (
   Id int not null primary key
)

create table Category (
   Id int not null promary key
)

create table SubCategory (
   CategoryId not null foreign key references Category(Id),
   Id int not null,
   constraint PK_SubCategory primary key (CategoryId, Id)
)

create table ProductCategory (
   ProductId int not null foreign key references Product(Id),
   CategoryId int not null foreign key references Category(Id),
   SubCategoryId int null,
   constraint PK_ProductCategory primary key (ProductId, CategoryId),
   constraint FK_ProductCategory_SubCategory foreign key (CategoryId, SubCategoryId) 
          references SubCategory(CategoryId, Id)
)
...
Рейтинг: 0 / 0
варианты спроектировать категории
    #35418660
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чорный Бада
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
create table Product (
   Id int not null primary key
)

create table Category (
   Id int not null promary key
)

create table SubCategory (
   CategoryId not null foreign key references Category(Id),
   Id int not null,
   constraint PK_SubCategory primary key (CategoryId, Id)
)

create table ProductCategory (
   ProductId int not null foreign key references Product(Id),
   CategoryId int not null foreign key references Category(Id),
   SubCategoryId int null,
   constraint PK_ProductCategory primary key (ProductId, CategoryId),
   constraint FK_ProductCategory_SubCategory foreign key (CategoryId, SubCategoryId) 
          references SubCategory(CategoryId, Id)
)
А зачем в таблице ProductCategory поле CategoryId?
Это же потенциальное место возникновения противоречий, например, после переноса подкатегории в другую категорию.
...
Рейтинг: 0 / 0
варианты спроектировать категории
    #35418784
Чорный Бада
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftА зачем в таблице ProductCategory поле CategoryId?
Это же потенциальное место возникновения противоречий, например, после переноса подкатегории в другую категорию.
Потому что по задаче продукты и категории связаны как M-2-M. Противоречия не возникнет, т.к. внешний ключ FK_ProductCategory_SubCategory помешает.
...
Рейтинг: 0 / 0
варианты спроектировать категории
    #35418802
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чорный БадаПротиворечия не возникнет, т.к. внешний ключ K_ProductCategory_SubCategory помешает.Как же он помешает?
Пример:
есть категории А и Б.
есть подкатегории 1, 2, 3.
подкатегории 1 и 2 входят в категорию А, подкатегория 3 входит в категорию Б.
есть масса товара, привязанного к подкатегориям А1, А2, Б3.
В какой-то момент подкатегорию 2 переносят из категории А в категорию Б.
Товар как был привязан к А2, так и остался. Хотя это уже некоррекно.

Т.е. у вас от товара до категории две связи - одна прямая, другая через подкатегорию. В какой-то момент эти две связи могут начать противоречить друг другу.
...
Рейтинг: 0 / 0
варианты спроектировать категории
    #35418855
Чорный Бада
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft
Код: plaintext
1.
2.
constraint FK_ProductCategory_SubCategory
          foreign key (CategoryId, SubCategoryId) 
          references SubCategory(CategoryId, Id)
означает, что если продукт относится к категории CategoryId и подкатегории SubCategoryId, то в отношении SubCategory присутствует кортеж (CategoryId, SubCategoryId), т.е. подкатегория к которой относится продукт обязательно относится к категории к которой он относится.
...
Рейтинг: 0 / 0
варианты спроектировать категории
    #35418875
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чорный Бада miksoft
Код: plaintext
1.
2.
constraint FK_ProductCategory_SubCategory
          foreign key (CategoryId, SubCategoryId) 
          references SubCategory(CategoryId, Id)
означает, что если продукт относится к категории CategoryId и подкатегории SubCategoryId, то в отношении SubCategory присутствует кортеж (CategoryId, SubCategoryId), т.е. подкатегория к которой относится продукт обязательно относится к категории к которой он относится.Да, сорри, просмотрел, что там два поля в форинкее, а не одно.

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

Я бы таки предложил товар связывать только с подкатегорией.
...
Рейтинг: 0 / 0
варианты спроектировать категории
    #35418913
Чорный Бада
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftНо как тогда производить перенос подкатегории в другую категорию?
А зачем? Чтобы в категории "фильмы" появилась подкатегория "зимние ботинки", а в категории "шмотки" - подкатегория "комедии"?
...
Рейтинг: 0 / 0
25 сообщений из 33, страница 1 из 2
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / варианты спроектировать категории
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]