[英]Database design choice : Order Belongs To Invoice Or Invoice Belongs To a Order
有一个网站,用于销售实体产品......现在他们想要销售一些完全不同的服务之王....像信用包收取用户帐户(购买产品)或购买短信..这样的东西
所以db过去看起来像这样
order : user_id ,date , total_price
order_items : order_id , item_id , quantity , price
invoice : order_id , price , settled
Invoice_transactions : invoice_id , amount , date
基本上发票属于订单
现在他们想要销售服务,所以我们要创建2个orders
表
product_orders (it used to be orders)
service_orders
现在我必须选择发票表的设计
我可以添加添加另一个字段来指示订单的类型
invoice : order_id , order_type , amount
1 , product , 10000
1 , service , 10000
这在某种程度上感觉不对...或者我可以在订单中添加发票ID
invoice : order_type , amount , date
product_orders : invoice_id , date , total_price
service_orders : invoice_id , service_id , date , total_price
这是服务表的样子:
这一切都取决于您想要实现的目标,客户可以在一个订单中同时购买吗? 最常见的是你对带有order_type的发票所做的事情,它将具有最少的重复
这就是我想要做的:
表types
type_id | name
1 | product
2 | service
表items
将有两个共同的列 - 产品和服务。
items: item_id, type_id FK(types.type_id), price, title, ...
使用FK item_id
和两种类型不常见的列(如products.weight
)列出products
和services
。
将type_id
列添加到orders
表:
order : user_id, date, total_price, type_id FK(types.type_id)
将type_id
列添加到表order_items
:
order_items: order_id, item_id, type_id, quantity, price
FK将是:
(order_id, type_id) -> orders(order_id, type_id)
(item_id, type_id) -> items(item_id, type_id)
对于那些FK,不可能在一个订单中混合不同的类型。
我认为产品订单和服务订单的共同点多于它们的差异。 在更大的商业和金融生态系统中,他们可能共享相同的角色/职能。 所以我的第一直觉就是有两种订单的单一表。
另一种方法是只有一个order_
表,其中一列指示哪种类型的订单命名为order_type_
其中包含sales
或products
order_type_
。
将所有与产品相关的列移动到单独的子表product_info_
。 将所有与销售相关的列移动到单独的子表service_info_
。 我会将order_
table作为两者的父级,尽管从技术上讲,我们有一对一的关系。 对于任何给定的order_
行,我们只有一个product_info_
行或恰好一个service_info_
行。
这可以最大限度地减少数据库中的数据重复和应用程序中的编码。 当您需要产品或服务详细信息时,您的应用代码使用标记字段order_type_
来适当地查询一个或另一个子表。
发票表链接到订单表。 我假设两种类型的订单的发票工作几乎相同。
另一种选择是简单地包含order_
表中的所有产品和服务字段。 只需忽略服务订单的产品相关字段,并忽略产品订单的服务相关字段。 不是最优雅的,但是如果你有相对较少的字段,并且可能在列名称前加上prod_
和serv_
,这可能是切实可行的。 我当然不止一次这样做过。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.