Я работаю с категориями в своем проекте. Теперь моя структура базы данных категорий выглядит так:
id
title
description
slug
parent_id
Проблема:
В настоящее время у меня есть две категории для продуктов. Первая категория предназначена для «Продажи», а вторая — для «Покупки» товаров. В категории «Распродажа» продавцы выставляют свои товары на продажу. А в категории «Покупка» покупатели размещают некоторые товары для покупки. В этом случае обе категории будут иметь одинаковые подкатегории. В моей структуре таблицы я дублирую подкатегории для обеих категорий следующим образом:
Распродажа
Купить
База данных
id | title | description | slug | parent_id
-------------------------------------------
1 | Sale | null | sale | null
2 | Bags | null | bags | 1
3 | Shoes | null | shoes| 1
4 | Dress | null | dress| 1
5 | Buy | null | buy | null
6 | Bags | null | bags | 2
7 | Shoes | null | shoes| 2
8 | Dress | null | dress| 2
-------------------------------------------
Как мне создать правильную структуру таблицы, чтобы избежать дублирования подкатегорий в моем случае?
У меня столы products и categories только сейчас.
Если аспект {Продажи, Покупки} и аспект "подкатегории" независимы, зачем вам список комбинаций в БД?
@danish-khan-I В моем случае все подкатегории имеют дочерние элементы
@Serg Что вы порекомендуете решить проблему другим способом?
Проекты DB/SQL для подтипов — это часто задаваемые вопросы.
Почему две категории (купить/продать)? Добавьте к вашему примеру случай, когда они не совпадают. Я даже не понимаю, почему у вас 8 рядов, а не 3 (сумки, туфли, платье).






Ну, во-первых, не обязательно иметь две отдельные категории для продажи/покупки.
потому что, если вы сделаете такое, единственный способ, которым вы можете иметь точно такие же подкатегории, - это отразить их (создать, отредактировать, удалить 2 раза везде в вашем коде)
Еще одно решение — иметь сводную таблицу, чтобы ваши подкатегории могли иметь несколько родителей (отношения «многие ко многим»).
но если вы хотите придерживаться простых отношений «один ко многим», я предлагаю создать одну общую родительскую категорию и дважды использовать ее в своем меню: один раз для продажи и один раз для покупки.
редактировать: Ваша миграция будет выглядеть так, если вы хотите использовать подход «многие ко многим»:
Schema::create('category_relations', function (Blueprint $table) {
$table->unsignedBigInteger('parent_id');
$table->unsignedBigInteger('child_id');
});
и ваша модель:
Class Category extends Model{
public function parents(){
return $this->belongsToMany(Category::class,'category_relations','child_id','parent_id');
}
public function children(){
return $this->belongsToMany(Category::class,'category_relations','parent_id','child_id');
}
}
Я тоже думаю, что отношение «многие ко многим», вероятно, является правильным способом сделать это, предполагая, что подкатегории семантически идентичны, независимо от того, предназначены ли они для покупки или продажи.
Есть ли в подкатегории дочерние элементы или она ограничена категорией и подкатегорией?