如何创建正确的数据库结构以避免重复数据

时间:2020-12-19 06:48:46

标签: mysql sql database laravel database-design

我在我的项目中使用类别。现在我的分类数据库结构是这样的:

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
-------------------------------------------

如何创建正确的表结构以避免在我的情况下出现重复的子类别?

我现在只有 productscategories 桌。

1 个答案:

答案 0 :(得分:2)

嗯,首先,您不一定需要有两个单独的类别来进行销售/购买。

因为如果你做了这样的事情,你可以拥有完全相同的子类别的唯一方法是镜像它们(在代码中的任何地方创建、编辑、删除 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');
    }
}
相关问题