0

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

问题:

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

产品 1 = 苹果 iPhone 5

颜色选项:黑色


  1. 选项 1 黑色:16GB

    选项 1 的库存:15

    选项 1 的售价:900 美元


  2. 选项 2 黑色:32GB

    选项 2 的库存:32

    选项 2 的销售价格:1.200 美元


  3. 选项 3 黑色:128GB

    选项 3 的库存:24

    选项 3 的销售价格:1.700 美元


颜色选项:白色


  1. 白色选项 1:32GB

    选项 1 的库存:9

    选项 1 的售价:930 美元


  2. 选项 2 白色:64GB

    选项 2 的库存:12

    选项 2 的售价:1.270 美元


产品 2 = 摩托罗拉 Xoom 9868AB机箱

材料选项:皮革


  1. 皮革选项 1:灰色

    选项 1 的库存:90

    选项 1 的售价:12 美元


  2. 皮革选项2:粉红色

    选项 2 的库存:12

    选项 2 的售价:12.70 美元


材料选项:硬壳


  1. 硬壳选项 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() 产品和变体。你将如何解决这个问题?

4

5 回答 5

1

The option table should be hasAndBelongsToMany() with the Products table. Then each stock, and price should be hasAndBelongsToMany() to the options table.

Products table:

id
product_name
created_at
updated_at

Options table:

id
option_name
created_at
updated_at

option_product table:

id (optional(
option_id
product_id
created_at
updated_at

Stock table:

id
count
created_at
updated_at

option_stock table:

id (optional)
option_id
stock_id
created_at
updated_at

Prices table:

id
price
created_at
updated_at

option_price table:

id (optional)
option_id
price_id
created_at
updated_at

This will give you the ability to have one entry of Option color purple that could be applied to many different products, and many different prices for purple. Also your queries wont be too terrible as you will be able to eager load your options and other tables (see http://laravel.com/docs/eloquent#eager-loading)

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

The admin side of creating products for the site could be done pretty easy, but that is a different question.

于 2013-08-24T07:27:08.703 回答
0

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

于 2013-08-27T11:33:30.487 回答
0

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

产品

  • product_id (pk)
  • 姓名
  • 价格

Product_Option_Map

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

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

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

于 2013-08-27T17:01:08.763 回答
0

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

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

于 2013-08-21T17:59:09.653 回答
0

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

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

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

于 2018-07-05T04:59:08.213 回答