Laravel 订单数据库架构咨询
Laravel orders database architecture advice
我一直在为一个 Laravel 5.8 应用程序设置一个订单系统,但我认为我已经使订单系统的数据库架构过于复杂(或没有)。
我创建了以下 tables:order
、order_items
、products
、services
、prices
,当然还使用了users
table 作为 'client'.
我现在的疑问是将 products
和 services
作为单独的 table 还是仅在新的 items
上使用,这将说明该项目是否是'product' 或 'service'.
这是因为在为 Order::class
和 OrderItem::class
模型建立模型关系时,我似乎陷入了 'knot'.
我的 table 如下:
订单
+-------------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+---------------------+------+-----+---------+----------------+
| id | bigint(20) unsigned | NO | PRI | NULL | auto_increment |
| guid | varchar(191) | NO | | NULL | |
| user_id | int(10) unsigned | YES | MUL | NULL | |
| firm_id | bigint(20) unsigned | YES | MUL | NULL | |
| currency_id | int(10) unsigned | YES | MUL | 1 | |
| total | double(8,2) | NO | | 0.00 | |
| status | varchar(191) | YES | | NULL | |
| created_at | timestamp | YES | | NULL | |
| updated_at | timestamp | YES | | NULL | |
| deleted_at | timestamp | YES | | NULL | |
+-------------+---------------------+------+-----+---------+----------------+
order_items
+---------------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+---------------------+------+-----+---------+----------------+
| id | bigint(20) unsigned | NO | PRI | NULL | auto_increment |
| product_id | int(10) unsigned | YES | MUL | NULL | |
| service_id | bigint(20) unsigned | YES | MUL | NULL | |
| order_id | bigint(20) unsigned | NO | MUL | NULL | |
| quantity | double(8,2) | NO | | 1.00 | |
| quantity_type | varchar(191) | YES | | NULL | |
| notes | varchar(191) | YES | | NULL | |
| created_at | timestamp | YES | | NULL | |
| updated_at | timestamp | YES | | NULL | |
| deleted_at | timestamp | YES | | NULL | |
+---------------+---------------------+------+-----+---------+----------------+
产品
+--------------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+---------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| guid | varchar(191) | NO | UNI | NULL | |
| name | varchar(191) | NO | | NULL | |
| name_slug | varchar(191) | NO | | NULL | |
| details | text | NO | | NULL | |
| has_shipment | tinyint(1) | NO | | NULL | |
| created_at | timestamp | YES | | NULL | |
| updated_at | timestamp | YES | | NULL | |
| deleted_at | timestamp | YES | | NULL | |
+--------------+---------------------+------+-----+---------+----------------+
服务
+-------------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+---------------------+------+-----+---------+----------------+
| id | bigint(20) unsigned | NO | PRI | NULL | auto_increment |
| guid | varchar(191) | NO | UNI | NULL | |
| name | varchar(191) | NO | | NULL | |
| name_slug | varchar(191) | NO | | NULL | |
| description | text | NO | | NULL | |
| created_at | timestamp | YES | | NULL | |
| updated_at | timestamp | YES | | NULL | |
| deleted_at | timestamp | YES | | NULL | |
+-------------+---------------------+------+-----+---------+----------------+
价格
+-------------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+---------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| product_id | int(11) | YES | MUL | NULL | |
| service_id | bigint(20) unsigned | YES | MUL | NULL | |
| currency_id | int(10) unsigned | YES | MUL | NULL | |
| value | double(8,2) | YES | | NULL | |
| created_at | timestamp | YES | | NULL | |
| updated_at | timestamp | YES | | NULL | |
| deleted_at | timestamp | YES | | NULL | |
+-------------+---------------------+------+-----+---------+----------------+
用户(简体)
+-------------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+---------------------+------+-----+---------+----------------+
| id | bigint(20) unsigned | NO | PRI | NULL | auto_increment |
| guid | varchar(191) | NO | UNI | NULL | |
| name | varchar(191) | NO | | NULL | |
| name_slug | varchar(191) | NO | | NULL | |
| email | varchar(191) | NO | | NULL | |
| ... | ... | ... | ... | ... | ... |
| created_at | timestamp | YES | | NULL | |
| updated_at | timestamp | YES | | NULL | |
| deleted_at | timestamp | YES | | NULL | |
+-------------+---------------------+------+-----+---------+----------------+
我的目标是让 订单 包含一个或多个 产品 and/or 服务,以及他们各自的用户价格。
示例:
$order = Order::where('id', 1)->with('users', 'items', 'prices')->get();
但我可以获取 'Order'、'User'、'Items',但不能获取每个项目的 'Prices'。
我试过的
Order::class
和 OrderItem::class
模型(例如:$this->belongsTo(Product::class)
)的不同关系方法,但似乎没有正确处理。
如上所述,我几乎可以买到所有东西,但不能买到价格。
问题:我是否应该将产品和服务合并为一个table 并且有一列用于 type(如 service、product)?
在此先感谢您的任何建议。
我认为合并这些表不是最好的方法。在我看来,这是多态关系的完美用法。根据 Laravel 的文档:
A polymorphic relationship allows the target model to belong to more than one type of model using a single association.
来源:https://laravel.com/docs/5.8/eloquent-relationships#polymorphic-relationships
看看https://laravel.com/docs/5.8/eloquent-relationships#many-to-many-polymorphic-relations。如果您有任何问题,请在此处发表评论。我很乐意帮助你。
我一直在为一个 Laravel 5.8 应用程序设置一个订单系统,但我认为我已经使订单系统的数据库架构过于复杂(或没有)。
我创建了以下 tables:order
、order_items
、products
、services
、prices
,当然还使用了users
table 作为 'client'.
我现在的疑问是将 products
和 services
作为单独的 table 还是仅在新的 items
上使用,这将说明该项目是否是'product' 或 'service'.
这是因为在为 Order::class
和 OrderItem::class
模型建立模型关系时,我似乎陷入了 'knot'.
我的 table 如下:
订单
+-------------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+---------------------+------+-----+---------+----------------+
| id | bigint(20) unsigned | NO | PRI | NULL | auto_increment |
| guid | varchar(191) | NO | | NULL | |
| user_id | int(10) unsigned | YES | MUL | NULL | |
| firm_id | bigint(20) unsigned | YES | MUL | NULL | |
| currency_id | int(10) unsigned | YES | MUL | 1 | |
| total | double(8,2) | NO | | 0.00 | |
| status | varchar(191) | YES | | NULL | |
| created_at | timestamp | YES | | NULL | |
| updated_at | timestamp | YES | | NULL | |
| deleted_at | timestamp | YES | | NULL | |
+-------------+---------------------+------+-----+---------+----------------+
order_items
+---------------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+---------------------+------+-----+---------+----------------+
| id | bigint(20) unsigned | NO | PRI | NULL | auto_increment |
| product_id | int(10) unsigned | YES | MUL | NULL | |
| service_id | bigint(20) unsigned | YES | MUL | NULL | |
| order_id | bigint(20) unsigned | NO | MUL | NULL | |
| quantity | double(8,2) | NO | | 1.00 | |
| quantity_type | varchar(191) | YES | | NULL | |
| notes | varchar(191) | YES | | NULL | |
| created_at | timestamp | YES | | NULL | |
| updated_at | timestamp | YES | | NULL | |
| deleted_at | timestamp | YES | | NULL | |
+---------------+---------------------+------+-----+---------+----------------+
产品
+--------------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+---------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| guid | varchar(191) | NO | UNI | NULL | |
| name | varchar(191) | NO | | NULL | |
| name_slug | varchar(191) | NO | | NULL | |
| details | text | NO | | NULL | |
| has_shipment | tinyint(1) | NO | | NULL | |
| created_at | timestamp | YES | | NULL | |
| updated_at | timestamp | YES | | NULL | |
| deleted_at | timestamp | YES | | NULL | |
+--------------+---------------------+------+-----+---------+----------------+
服务
+-------------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+---------------------+------+-----+---------+----------------+
| id | bigint(20) unsigned | NO | PRI | NULL | auto_increment |
| guid | varchar(191) | NO | UNI | NULL | |
| name | varchar(191) | NO | | NULL | |
| name_slug | varchar(191) | NO | | NULL | |
| description | text | NO | | NULL | |
| created_at | timestamp | YES | | NULL | |
| updated_at | timestamp | YES | | NULL | |
| deleted_at | timestamp | YES | | NULL | |
+-------------+---------------------+------+-----+---------+----------------+
价格
+-------------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+---------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| product_id | int(11) | YES | MUL | NULL | |
| service_id | bigint(20) unsigned | YES | MUL | NULL | |
| currency_id | int(10) unsigned | YES | MUL | NULL | |
| value | double(8,2) | YES | | NULL | |
| created_at | timestamp | YES | | NULL | |
| updated_at | timestamp | YES | | NULL | |
| deleted_at | timestamp | YES | | NULL | |
+-------------+---------------------+------+-----+---------+----------------+
用户(简体)
+-------------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+---------------------+------+-----+---------+----------------+
| id | bigint(20) unsigned | NO | PRI | NULL | auto_increment |
| guid | varchar(191) | NO | UNI | NULL | |
| name | varchar(191) | NO | | NULL | |
| name_slug | varchar(191) | NO | | NULL | |
| email | varchar(191) | NO | | NULL | |
| ... | ... | ... | ... | ... | ... |
| created_at | timestamp | YES | | NULL | |
| updated_at | timestamp | YES | | NULL | |
| deleted_at | timestamp | YES | | NULL | |
+-------------+---------------------+------+-----+---------+----------------+
我的目标是让 订单 包含一个或多个 产品 and/or 服务,以及他们各自的用户价格。
示例:
$order = Order::where('id', 1)->with('users', 'items', 'prices')->get();
但我可以获取 'Order'、'User'、'Items',但不能获取每个项目的 'Prices'。
我试过的
Order::class
和 OrderItem::class
模型(例如:$this->belongsTo(Product::class)
)的不同关系方法,但似乎没有正确处理。
如上所述,我几乎可以买到所有东西,但不能买到价格。
问题:我是否应该将产品和服务合并为一个table 并且有一列用于 type(如 service、product)?
在此先感谢您的任何建议。
我认为合并这些表不是最好的方法。在我看来,这是多态关系的完美用法。根据 Laravel 的文档:
A polymorphic relationship allows the target model to belong to more than one type of model using a single association.
来源:https://laravel.com/docs/5.8/eloquent-relationships#polymorphic-relationships
看看https://laravel.com/docs/5.8/eloquent-relationships#many-to-many-polymorphic-relations。如果您有任何问题,请在此处发表评论。我很乐意帮助你。