设计数据库 - 更好的方法

时间:2010-07-09 11:23:47

标签: database-design

我有一个表Costumers和另一个CostumersPayments

CostumersPayments我有付款方式(MB,Visa等)。

我的问题是,每个客户都可以有多个付款,所以我无法创建一个名为“IDPayment”的字段,我在其中设置了该付款的ID,而且我不知道我将支付多少付款(管理员可以添加或删除)。

您如何建议我将付款ID存储在表格Costumers中?创建一个我将它们存储为数组的字段? (“1,2,3”用逗号分隔)。

由于

6 个答案:

答案 0 :(得分:3)

这基本上是many-to-many关系。客户可以有许多支付类型,并且可以从许多客户使用一种支付类型。只需要一个表格Costumers,表格PaymentTypes和表格CostumersPayments。此表格有两列 - CostumerIDPaymentTypeID。这将是一个复合主键(两列中的)。

CostumerPayments

| CostumerId | PaymentTypeId |
------------------------------
| 1          | 3             |
| 1          | 4             |
| 2          | 3             |
| 2          | 5             |
------------------------------

编辑:您将ids存储在一行中的初始命题(以逗号分隔)是数据库设计中最大的罪行之一。它甚至违反了第一种正常形式。查看here了解更多信息。

答案 1 :(得分:1)

在上面的描述中,听起来更像是每个客户可以进行多次付款。

在这种情况下,Payments表只需要在每行中都有CostumerID吗?

- 编辑: 你可能想要3张桌子。客户,付款和PaymentTypes(我试图明确我的表名)。

在PaymentTypes中,您有ID和名称。在付款中,存储CostumerID和PaymentTypeID。

答案 2 :(得分:1)

  

创建我存储它们的字段   像一个数组? (“1,2,3”分隔   引号)。

这会破坏关系数据库的normalization rules。不要做这样的事情。

答案 3 :(得分:1)

首先,如前所述,绝对不要在单个字段中存储多个值。正如其他人所描述的那样,出于许多原因,这是一个坏主意。

其次,我不清楚CostumerPayments表中包含的内容。这是个人付款(有金额)是由客户做出的吗?这些付款中的每一种都有与之相关的付款方式吗?

如果是这种情况,您需要以下表格:

  1. 客户,主键为CostumerID,根本没有参考付款。
  2. PaymentTypes,主键为PaymentTypeID,不提及付款或客户。
  3. CostumerPayments,其中CostumerID的外键指向Costumers表,而第二个外键是PaymentTypeID,指向PaymentTypes表。
  4. 要查找客户的所有付款,请查看CostumerPayments表WHERE CostumerID =<>。要在同一查询中获取客户信息和付款,请加入两个表Costumers和CostumerPayments。要查找付款类型的正确名称,请同时加入PaymentTypes表。

    或者,如果您的目标是存储允许每个客户使用的PaymentTypes列表(不是引用金额,只是允许客户使用的事实,例如VISA卡)添加表格:< / p>

    CostumerAllowedPaymentTypes,将外键CostumerID和PaymentTypeID放入各自的表中。

答案 4 :(得分:0)

您使用三张桌子。将客户信息存储在“客户”表中,并将CustomerId作为主键。将付款存储在“付款”表中,并将PaymentId作为主键。然后使用名为“CustomerPayments”的连接表,其主键为CustomerId和PaymentId 您不应将CustomerIds存储在Customer表中作为逗号分隔值。那不是规范化的数据库。见http://en.wikipedia.org/wiki/First_normal_form

坦率地说,我希望您不负责根据您的经验开发商业业务解决方案。

答案 5 :(得分:0)

在CostumersPayments中只有一个CustomerID列,并将其作为对客户的引用。

如果您想要检索客户的付款,只需加入表格。