我正在用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)似乎是最合適的,因爲您可以存儲各種屬性,而無需在新屬性上添加多個表格。但也許有更好的其他選擇?
在此先感謝!
感謝您的建議,真的很感激!是否仍然可以在對象上的一個鍵下擁有所有不同的屬性?如:$ location-> attributes-> payment_methods。而且,當拉拉維爾必須在位置表上加入15個表格而不是1個時,難道不會在數據庫上更難嗎? –
我不認爲需要爲您的位置添加中間級別的「attrivutes」。位置模型中的任何內容都可以是並且可以是屬性本身。我認爲這會增加您的模型和應用程序的複雜性,但沒有真正的好處。 關於表關係取決於它們之間的關係,如果它是一對多很容易。當它們在模型中嵌套關係時變得很難 –
但是對於每個新屬性,您需要2個表,一個用於存儲值和用於管理關係的數據透視表。所以,如果有10個屬性,你必須創建20個表...對我來說,看起來有點矯枉過正 –