SQL数据库设计 - 需要不同子表的类型表?

时间:2013-08-30 14:00:46

标签: sql ruby-on-rails ruby database postgresql

首先,我感谢任何帮助。

我正在努力寻找一些数据库设计的最佳方法,而且我甚至不确定在哪里开始搜索我甚至追求的设计类型。

简而言之,我们有一堆付款方式类型,例如现金,信用卡和PayPal。但是这些方法中的每一个都需要它们自己的一组参数用于它们的设置细节(即用于PayPal的API细节的信息)以及用于需要不同字段集的每个方法的事务 - 即。对于信用卡 - 我们需要开始日期,结束日期,卡号等。 - 对于paypal,我们需要电子邮件地址和其他一些东西。

现在 - 我可以只使用表格payment_method_typespayment_methodspayments,其中包含涵盖所有基础的所有必填字段 - 例如paypal_email_address字段等。但有没有更好的解决方案,模仿更多的基于文档的数据库,你只需拥有相关的领域?

例如,以下表格payment_method_typespaypal_payment_methodscash_payment_methodspaypal_paymentscash_payments等等。这看起来并不那么好。< / p>

对于我想要达到的目标,必须有一个很好的解决方案吗?我是否只需要包含所有可能的字段(即。paypal_email_address等...)并在我的应用程序中处理它?<​​/ p>

非常感谢任何意见。

2 个答案:

答案 0 :(得分:1)

我可以通过关系人:)来投票,但你可以在JSON(在PostgreSQL版本9.3中有JSON的良好支持)或hstore列中存储这类信息,它可以是关系数据库和noSQL风格的完美结合。

您可以在类型列中存储Amount,Date,Currency等常用字段,并使用一列JSON / hstore类型来存储卡号等其他详细信息。所以你的数据可能如下:

Type          Date         Amount  Currency  Additional
Credit Card   2013-08-01     15.1  EUR       {Card Number: "XXXX-XXXX-XXXX-XXXX"}
PayPal        2013-07-02    103.8  USD       {Email: "client@company.com"}

或hstore:

Type          Date         Amount  Currency  Additional
Credit Card   2013-08-01     15.1  EUR       Card Number => "XXXX-XXXX-XXXX-XXXX"
PayPal        2013-07-02    103.8  USD       Email => "client@company.com"

或者您可以创建子表以获取其他信息 - 因此您可以将常用数据存储在表格Payments中,并将所有其他信息存储在PaymentsPayPalPaymentsCreditCard等等。

答案 1 :(得分:1)

这个答案可能非常复杂,但我会选择一些简单的东西来激发灵感。像

这样的东西
CreditCardPayment < ActiveRecord::Base
  include PaymentType
  def paypal_some_kind_of_id
    2
  end
end

PaypalPayment < ActiveRecord::Base
  include PaymentType
  def paypal_some_kind_of_id
    1
  end
end

然后,每当处理付款时,只编写一种方法,并确保该方法适用于PaypalPaymentCreditCardPayment对象。对于所有类都相同的方法可以在PaymentType模块中,以保持代码干燥。