数据库设计:关联变量类型的表

时间:2014-12-11 16:16:21

标签: mysql sql database postgresql rdbms

我正在寻找一个解决方案(我想象的)一个常见且微不足道的问题,但我无法找到正确的词语来在Google上找到解决方案。

起始情况

我有一个与ordersproduct相关联的表格customer

orders (id, product_id, customer_id)

问题

每个订单都必须有相关的付款。这些付款来自不同的支付处理器(例如Paypal,条纹,Google电子钱包,亚马逊支付),因此具有与其相关联的不同类型的数据和数据字段。

我正在寻找一个干净且规范化的数据库设计。

我自己的尝试/想法

我可以为不同类型的付款创建单独的表格,并从那里关联order

paypal_payment (id, order_id, currency, amount, [custom paypal fields])
stripe_payment (id, order_id, currency, amount, [custom stripe info])
direct_debit_payment (id, order_id, currency, amount, [custom direct debit info])

问题:通过这种方法,我需要从每个表格SELECT查找每种付款类型,以查找与订单相关的付款,这对我来说似乎并不高效。

这个问题的清洁解决方案是什么?如果它完全相关,我就会使用MySQL。

感谢您的帮助! :)

3 个答案:

答案 0 :(得分:3)

您的Payment表格应包含所有付款通用的所有字段(金额,付款类型等)以及唯一ID。

然后,变量字段将存储在具有三列的第二个表中:

  • 付款UID(付款表的外键)
  • 类型(当前行存储的数据类型,即付款类型的自定义字段的名称)

这允许您将任意数量的自定义字段与每个付款记录相关联。

显然,每个付款可以在此次要表中包含任意数量的条目(如果不需要,则为无)。

这很有效,因为大多数情况下您不需要支付类型特定信息,并且可以执行忽略此表的查询。但是当你需要时,数据仍会存在。

答案 1 :(得分:1)

如果您永远不会使用这些字段' where或join子句中的内容(通常是这样):

  1. 添加付款方式字段(枚举或varchar)
  2. 序列化paypal,条带或客户端用作json的任何内容
  3. 使用最合适的数据库类型存储事物 - MySQL中的文本,Postgres中的json。

答案 2 :(得分:1)

您可以执行此操作的标准化方法是为其他付款类型设置基本付款表和扩展表。 所有常见的付款信息都会放在您的payment_base表格中。

payment_base(payment_id, order_id, currency, amount)
paypal_payment (paypal_payment_id, payment_id, [custom paypal fields])
stripe_payment  (stripe_payment_id, payment_id, [custom stripe info])
direct_debit_payment  (direct_debit_payment_id, payment_id, [custom direct debit info])