我正在使用Laravel构建一个Web应用程序,用户可以根据邻近度和属性过滤器搜索位置,现在我想知道什么是存储属性的好架构。
例如,用户可以为餐馆创建一个列表,然后应该能够添加关于餐馆接受哪些付款选项的信息(现金,卡,甚至是paypal),它是什么类型的餐馆(快餐) ,晚餐,午餐室)或他们有什么类型的厨房(墨西哥,意大利,法国)。
我想建立一个解决方案:
我想出了一些如何解决这个问题的解决方案,但是我不确定哪个是最好的,是否有更好的解决方案?
选项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 |
----------------------------------
现在所有的值都存储在一个表中,因此管理员可以轻松添加可能的选项,这很容易在lalovel中使用Eloquent进行维护
\App\Location::with('paymentMethods')->...
但问题是,对于每种类型的属性,我都需要添加迁移,数据库会混乱使用 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 |
--------------------------------------------
所有值都存储在一个表中,管理员也可以立即添加选项和新属性。没有必要添加新表,所以这对我来说似乎更清晰。问题似乎更多的是关于一个表格混杂着各种信息/属性。
另外,我想知道如何通过Eloquent以下列格式从数据库中检索数据:
$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)似乎是最合适的,因为您可以存储各种属性,而无需在新属性上添加多个表。但也许还有其他选择哪个更好?
提前致谢!
答案 0 :(得分:1)
毫无疑问,我会选择第二种选择。它意味着数据库上有更多的managin,也许还有更多的应用程序屏幕。另一方面是可维护的,如果您决定长大任何表格(例如付款方式的税),您只需要修改一个表格,并且更改将与之相关。此外,如果你考虑Laravel中模型与表格相关的部分,那么还有另外一点可以做到这一点。您可能会发现,如果表格之间的关系变得非常混乱或复杂,那么这种情况就不会像使用较少的表格一样容易和直接,但仍然可以使用。
希望有所帮助,但这只是我的意见;)