2016-09-13 68 views
0

我正在用Laravel構建一個Web應用程序,用戶可以根據鄰近和屬性過濾器搜索位置,現在我想知道什麼是存儲屬性的好架構。如何存儲實體的動態/多個屬性

例如,用戶可以爲餐廳創建一個列表,然後應該能夠添加關於餐廳接受哪些支付選項(現金,卡,甚至是paypal)的信息,它是什麼類型的餐館(快速食物,晚餐,午餐室)或他們有什麼類型的廚房(墨西哥,意大利,法國)。

我想建立一個解決方案,其中:

  • 屬性是不是強制性的,管理員不必填寫所有屬性
  • 位置麪包車有多個值的屬性,例如在一家餐廳可以支付現金和卡
  • 該解決方案符合Laravel的「思維方式」。我很想把它很好地一起玩雄辯

我想出瞭如何解決這個問題的一些解決方案,但我不知道這是最好的,如果有可能是一個更好的解決方案?

選項1

序列化在一列中「屬性」上的位置表本身的一切,例如。這似乎是一種「懶惰的方式」,因爲維護/更新位置非常困難,搜索/過濾更多。

選項2

有不同的表的所有值每個屬性和許多與位置的許多關係。例如一臺payment_methods

----------------------------- 
| id | name | description | 
----------------------------- 
| 1 | cash | ......  | 
----------------------------- 
| 2 | card | ......  | 
----------------------------- 
| 3 | paypal | ......  | 
----------------------------- 

而且鏈接的付款方式,地點

---------------------------------- 
| id | payment_id | location_d | 
---------------------------------- 
| 1 |  1  |  1  | 
---------------------------------- 
| 2 |  2  |  1  | 
---------------------------------- 
| 3 |  1  |  2  | 
---------------------------------- 

現在所有的值存儲在一個表中,以便管理員可以輕鬆地添加可能的選擇和數據透視表這很容易維護laravel與雄辯

\App\Location::with('paymentMethods')->... 

但問題是,對於每種類型的屬性,我需要一個dd一個遷移和數據庫會混亂像表payment_methods,kitchen_types & restaurant_types。我認爲這不會是可維護的,因爲您需要爲每個新屬性編寫新的管理界面和遷移。

選項3

有一個表(product_attributes)與所有的屬性,值和描述。人們可以將屬性值與屬性值分組,作爲位置上的屬性,並將值作爲數組進行分組。

------------------------------------------------ 
| id | attribute | value | description | 
------------------------------------------------ 
| 1 | payment_method | cash | ......  | 
------------------------------------------------ 
| 2 | payment_method | card | ......  | 
------------------------------------------------ 
| 3 | payment_method | PayPal | ......  | 
------------------------------------------------ 
| 4 | kitchen_type | French | ......  | 
------------------------------------------------ 
| 5 | kitchen_type | Italian | ......  | 
------------------------------------------------ 
| 6 | kitchen_type | Mexican | ......  | 
------------------------------------------------ 

而且鏈接的付款方式,地點

-------------------------------------------- 
| id | product_attribute_id | location_d | 
-------------------------------------------- 
| 1 |   1   |  1  | 
-------------------------------------------- 
| 2 |   2   |  1  | 
-------------------------------------------- 
| 3 |   3   |  2  | 
-------------------------------------------- 

所有值都存儲在一個表,管理員也可以馬上添加選項和新屬性的數據透視表。沒有必要添加新表格,所以對我來說看起來更清潔。問題的關鍵似乎更多的是關於一張桌子滿是各種信息/屬性的問題。

而且我想知道如何在下面的格式通過洋洋灑灑從數據庫中檢索數據:

$location->attributes->attribute_name = ['value1', 'value2'] 

例如

$location = \App\Location::with('productAttributes')->find($id); 

$location->attributes->payment_methods = ['Cash'] 
$location->attributes->kitchen_types = ['French', 'Italian'] 

誰能請告訴我什麼是一個好的解決方案在我的情況?對我來說,最後一個選項(3)似乎是最合適的,因爲您可以存儲各種屬性,而無需在新屬性上添加多個表格。但也許有更好的其他選擇?

在此先感謝!

回答

1

我會毫不懷疑地與第二個選項。這意味着更多的數據庫managin和應用程序可能多一些屏幕。另一方面是可維護的,如果你決定成長任何一個表(例如支付方法的稅收),你只需要修改一個表,並且這些變化將與它相關。另外,如果考慮模型與桌子相關的Laravel部分,那麼還有另一點需要獨立完成。你可能發現的缺點是,如果表之間的關係變得非常混亂或者複雜的雄辯不能像表格那樣簡單直接,但仍然可用。

希望能有所幫助,但這只是我的意見;)

+0

感謝您的建議,真的很感激!是否仍然可以在對象上的一個鍵下擁有所有不同的屬性?如:$ location-> attributes-> payment_methods。而且,當拉拉維爾必須在位置表上加入15個表格而不是1個時,難道不會在數據庫上更難嗎? –

+0

我不認爲需要爲您的位置添加中間級別的「attrivutes」。位置模型中的任何內容都可以是並且可以是屬性本身。我認爲這會增加您的模型和應用程序的複雜性,但沒有真正的好處。 關於表關係取決於它們之間的關係,如果它是一對多很容易。當它們在模型中嵌套關係時變得很難 –

+0

但是對於每個新屬性,您需要2個表,一個用於存儲值和用於管理關係的數據透視表。所以,如果有10個屬性,你必須創建20個表...對我來說,看起來有點矯枉過正 –

相關問題