基于 laravel 4 的电子商务应用程序的关系数据库设计建议

Posted

技术标签:

【中文标题】基于 laravel 4 的电子商务应用程序的关系数据库设计建议【英文标题】:Relational database design advice for laravel 4 based e-commerce application 【发布时间】:2013-08-20 09:44:43 【问题描述】:

我使用 Laravel 4 开发了一个电子商务应用程序,需要一个建议来解决我的数据库设计问题。

问题:

我的客户的产品有多种变体/选项。例如:

Product1 = Apple Iphone 5

颜色选项:黑色


    黑色选项 1:16GB

    选项 1 的库存:15

    选项 1 的售价:900 美元


    黑色选项 2:32GB

    选项 2 的库存:32

    选项 2 的售价:1.200 美元


    黑色选项 3:128GB

    选项 3 的库存:24

    选项 3 的售价:1.700 美元


颜色选项:白色


    白色选项 1:32GB

    选项 1 的库存:9

    选项 1 的售价:930 美元


    选项 2 白色:64GB

    选项 2 的库存:12

    选项 2 的售价:1.270 美元


Product2 = 摩托罗拉 Xoom 9868AB 机箱

材质选择:皮革


    皮革选项1:灰色

    选项 1 的库存:90

    选项 1 的售价:12 美元


    皮革选项2:粉红色

    选项 2 的库存:12

    选项 2 的售价:12.70 美元


材质选项:硬壳


    硬壳选项1:黑色

    选项 1 的库存:51

    选项 1 的售价:32.90 美元


我的方法:

正如您在上面看到的,有许多产品具有不同类型的期权、股票、价格。我已经尝试过使用 belongsToMany() 类似的方法:

表格:产品

id 
name
created_at
updated_at

表格:变体

id
title
parent
created_at
updated_at

表格:product_variation

id
products_id
variations_id
stock 
purchase_price 
sales_price
created_at
updated_at

产品模型:

<?php
class Products extends Eloquent 
   protected $table = 'products';
   protected $fillable = array('name');
   public function variations() 
   return $this->belongsToMany('Variations','product_variation')
               ->withPivot('purchase_price', 'stock', 'sales_price')
               ->withTimestamps();
    

订单模型应该如何?订单将 hasMany() 产品和变体。你会如何解决这个问题?

【问题讨论】:

为什么不将每个产品变体都作为自己的产品?即产品 1 是 Iphone5 白色,产品 2 是 Iphone 黑色等 这真的是非常老式的方式。因为这家店真的很难管理。无论是前端还是后端。让我们想象一下,作为一家 T 恤店,您是一位想购买黑色和 XL 码的阿迪达斯 345 衬衫的客户。导航,寻找产品就像一场噩梦...... mysql Shopping Cart Structure? Thaks 这对这个问题非常有用。仍在寻找您建议的雄辩关系。 顺便说一句,在您的结构中,变体没有自己的库存和价格。 【参考方案1】:

看看我用产品的属性和属性分隔的迁移文件。

属性为正面或客户可以更改属性(例如:颜色、尺寸) 属性是产品的固定属性,例如:床单材料(例如:棉)

https://github.com/avored/framework/blob/master/database/migrations/2017_03_29_000000_avored_framework_schema.php

【讨论】:

【参考方案2】:

我的猜测是有些产品有变化,有些则没有。在某些时候,您会想要为产品(和变体)创建订单。如果产品和变体被建模为完全不同的实体,建模订单和其他事情将变得很麻烦。我会提出一个更简单的解决方案,其中产品和变体都被建模为产品,并且变体或选项通过关联表链接到父产品,如下所示:

产品

product_id (pk) 姓名 价格

Product_Option_Map

parent_product_id(转至 product.product_id) option_product_id(转至 product.product_id) option_number(如果需要确保订购)

如有必要,您可以在产品表中添加一个“类型”列,这将使您的系统能够轻松识别具有选项的产品。当然,这总是可以从存在的 Product_Option_Map 行中推断出来,其中 parent_product_id 与给定的 product_id 匹配。

我注意到其中一位受访者在他们自己的表格中模拟了价格。我鼓励您与您的客户讨论定价要求,因为现实世界的系统很少能够简单地存储每个产品的单一价格。您可能会发现有各种各样的促销、批量折扣、优惠券、预先安排的客户折扣计划等……在产品表中存储“售价”很可能是不够的。

【讨论】:

【参考方案3】:

我建议你看看像http://www.couchbase.com/ 这样的noSQL 数据库。 就我而言,我在某些项目中的某些产品/服务上遇到了类似的问题。 Json / 对象存储帮助了我,我真的很高兴我决定搬到 couchbase。

【讨论】:

【参考方案4】:

选项表应该是 hasAndBelongsToMany() 和 Products 表。 那么每只股票,价格应该是 hasAndBelongsToMany() 到选项表中。

产品表:

id
product_name
created_at
updated_at

选项表:

id
option_name
created_at
updated_at

option_product 表:

id (optional(
option_id
product_id
created_at
updated_at

库存表:

id
count
created_at
updated_at

option_stock 表:

id (optional)
option_id
stock_id
created_at
updated_at

价格表:

id
price
created_at
updated_at

option_price 表:

id (optional)
option_id
price_id
created_at
updated_at

这将使您能够拥有一个选项颜色紫色条目,该条目可应用于许多不同的产品,以及紫色的许多不同价格。 此外,您的查询不会太糟糕,因为您将能够急切地加载您的选项和其他表(请参阅http://laravel.com/docs/eloquent#eager-loading)

<?php
$products = Product::with(array(
   'options',
   'options.stock',
   'options.prices'
))
->get();

为网站创建产品的管理方面可以很容易地完成,但这是一个不同的问题。

【讨论】:

嗯,很好的建议,非常感谢。但我没有在文档中看到 hasAndBelongsToMany()。你是说belongsToMany()吗? 是的,belongsToMany() 是您想要的。 laravel.com/docs/eloquent#many-to-many hasAndBelongsToMany() 是旧的 Laravel 3 试图溜进去。 @dr.linux 您找到适合您需求的解决方案了吗? 祝你好运! Python 非常强大,您可能可以毫无问题地从中获得所需。【参考方案5】:

每个具有多个值的属性都应该有自己的表,其中外键是基本项——例如,您可以在基本表中使用 iPhone,将颜色、内存大小等作为它们自己的表。然后定价表包含价格和完整描述该项目的所有外键(白色,64GB,iPhone)。

您可能想在查看“数据库规范化”时查找它。

【讨论】:

以上是关于基于 laravel 4 的电子商务应用程序的关系数据库设计建议的主要内容,如果未能解决你的问题,请参考以下文章

在 Laravel 4 中查询数据透视表

如何在 Laravel 中对所有行使用多态关系?

基于关系数据的查询 |拉拉维尔 5.4

从父多对多关系获取所有子模型 Laravel Eloquent

Laravel Eloquent 在 belongsToMany 关系上返回一个空集合

Laravel 基于自的多态关系