0

我使用Laravel 4開發了一個電子商務應用程序,並且需要一個建議來解決我的數據庫設計問題。基於laravel 4的電子商務應用程序的關係數據庫設計建議

問題:

我的客戶具有多種變化/期權產品。例如:

產品1 =蘋果iPhone 5

顏色選擇:黑色


  1. 選項一黑:16GB

    股票的選項1:15

    個銷售價格爲選項1:$ 900


  2. 選項2黑色:32GB

    股票的選項2:32

    銷售價格爲選項2:$ 1.200


  3. 2選項黑色:128GB

    Stock for Op tion3:24

    銷售價格爲2選項:$ 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對於硬殼:對於選項一黑

    庫存: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()產品和變體。你將如何解決這個問題?

+0

爲什麼不把每個產品的變體作爲自己的產品?即產品1是Iphone5白色,產品2是Iphone黑色等 – Laurence

+0

它確實非常老派的方式。因爲管理商店真的很難。前端和後端。讓我們想象一下,作爲T恤店,你是一個想買阿迪達斯345三色黑色和XL尺碼的顧客。導航,發現產品就像一場噩夢...... –

+2

請參閱[MySQL購物車結構](http://stackoverflow.com/a/10398545)? – eggyal

回答

0

每個具有多個值的屬性都應該有自己的表,其中外鍵是基本項 - 例如,您可以將基表中的iPhone,顏色,內存大小等作爲自己的表。然後定價表包含價格和完全描述該項目的所有外鍵(白色,64GB,iPhone)。

您可能想在查看時查看「數據庫規範化」。

1

選項表應該是hasAndBelongsToMany()與Products表。 然後每個股票,價格應該hasAndBelongsToMany()到選項表。

Products表:

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(); 

創造產品,爲網站的管理員側可以做很容易,但是這是一個不同的問題。

+0

嗯好建議,非常感謝。但是我沒有在文檔hasAndBelongsToMany()中看到。你的意思是belongsToMany()? –

+0

是的,belongsToMany()是你想要的。 http://laravel.com/docs/eloquent#many-to-many hasAndBelongsToMany()是舊的Laravel 3試圖滑入。 – codivist

+0

@ dr.linux您是否找到適合您需求的解決方案? – codivist

0

我建議你看一下像no這樣的noSQL數據庫。 就我而言,我在某些項目中遇到了與某些產品/服務相似的問題。 Json /對象存儲幫助了我,我真的很高興我決定轉移到couchbase。

+0

是的,我想到了Riak。這是在我心中:) –

0

我的猜測是有些產品有變化,有些則不變。在某些時候,您會希望爲產品(和變體)創建訂單。如果將產品和變體建模爲完全不同的實體,則建模順序和其他事物將變得繁瑣。我提出了一個簡單的解決方案,產品和變化都模擬成產品,其中變化或選項通過關聯錶鏈接到父產品如下:

產品

  • PRODUCT_ID(PK )
  • 價格

Product_Option_Map

  • parent_product_id(FK到PRODUCT.PRODUCT_ID)
  • option_product_id(FK到PRODUCT.PRODUCT_ID)
  • OPTION_NUMBER(如果有必要,以確保排序)

如果有必要,你可以添加一個 '類型' 列到產品表,這將使您的系統能夠輕鬆識別具有選項的產品。當然,這總是可以從parent_product_id與給定的product_id匹配的Product_Option_Map行的存在推斷出來。

我注意到其他受訪者之一在他們自己的表格中模擬了價格。我鼓勵您與您的客戶討論定價要求,因爲真實世界的系統很少能夠簡單地存儲每個產品的單個價格。您可能會發現有各種促銷活動,數量折扣,優惠券,預先安排的客戶折扣計劃等等。在產品表中存儲「銷售價格」很可能不足。

相關問題