Как создать правильную структуру базы данных, чтобы избежать дублирования данных

Я работаю с категориями в своем проекте. Теперь моя структура базы данных категорий выглядит так:

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 19.12.2020 08:02

Если аспект {Продажи, Покупки} и аспект "подкатегории" независимы, зачем вам список комбинаций в БД?

Serg 19.12.2020 08:03

@danish-khan-I В моем случае все подкатегории имеют дочерние элементы

Andreas Hunter 19.12.2020 08:06

@Serg Что вы порекомендуете решить проблему другим способом?

Andreas Hunter 19.12.2020 08:09

Проекты DB/SQL для подтипов — это часто задаваемые вопросы.

philipxy 19.12.2020 08:32

Почему две категории (купить/продать)? Добавьте к вашему примеру случай, когда они не совпадают. Я даже не понимаю, почему у вас 8 рядов, а не 3 (сумки, туфли, платье).

Rick James 20.12.2020 03:00
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
3
6
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ну, во-первых, не обязательно иметь две отдельные категории для продажи/покупки.

потому что, если вы сделаете такое, единственный способ, которым вы можете иметь точно такие же подкатегории, - это отразить их (создать, отредактировать, удалить 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');
    }
}

Я тоже думаю, что отношение «многие ко многим», вероятно, является правильным способом сделать это, предполагая, что подкатегории семантически идентичны, независимо от того, предназначены ли они для покупки или продажи.

apokryfos 19.12.2020 08:29

Другие вопросы по теме