如何存储实体的动态/多个属性

时间:2016-09-13 08:45:44

标签: php mysql laravel eloquent

我正在使用Laravel构建一个Web应用程序,用户可以根据邻近度和属性过滤器搜索位置,现在我想知道什么是存储属性的好架构。

例如,用户可以为餐馆创建一个列表,然后应该能够添加关于餐馆接受哪些付款选项的信息(现金,卡,甚至是paypal),它是什么类型的餐馆(快餐) ,晚餐,午餐室)或他们有什么类型的厨房(墨西哥,意大利,法国)。

我想建立一个解决方案:

  • 属性不是强制性的,管理员不必填写所有属性
  • 地点面包车有多个值属性,例如在餐馆,您可以支付现金和卡
  • 该解决方案符合Laravel的思维方式'。我很乐意与Eloquent一起玩得很好

我想出了一些如何解决这个问题的解决方案,但是我不确定哪个是最好的,是否有更好的解决方案?

选项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)似乎是最合适的,因为您可以存储各种属性,而无需在新属性上添加多个表。但也许还有其他选择哪个更好?

提前致谢!

1 个答案:

答案 0 :(得分:1)

毫无疑问,我会选择第二种选择。它意味着数据库上有更多的managin,也许还有更多的应用程序屏幕。另一方面是可维护的,如果您决定长大任何表格(例如付款方式的税),您只需要修改一个表格,并且更改将与之相关。此外,如果你考虑Laravel中模型与表格相关的部分,那么还有另外一点可以做到这一点。您可能会发现,如果表格之间的关系变得非常混乱或复杂,那么这种情况就不会像使用较少的表格一样容易和直接,但仍然可以使用。

希望有所帮助,但这只是我的意见;)