2010-07-09 64 views
0

我有一个表Costumers和另一个CostumersPayments设计数据库 - 更好的方法

CostumersPayments我有付款的类型(MB,Visa,等等)。

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

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

感谢

+1

它应该是客户:) – 2010-07-09 11:29:30

+2

@Petar:也许他只卖戏剧costumers?这是可能的。 。 。 – 2010-07-09 11:58:05

回答

3

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

CostumerPayments 

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

编辑:您在一排存储ids的初始命题,用逗号隔开,在数据库设计的最大的罪过之一。它甚至违反了第一种正常形式。请参阅here了解更多信息。

+0

正确,但请勿替代密钥 – gbn 2010-07-09 11:31:25

+0

是的,这里没有必要。但在更复杂的情况下,它可能是:) – 2010-07-09 11:32:43

+0

一对多,每次付款只与一个客户相关联。 – pascal 2010-07-09 11:49:27

1

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

在这种情况下,Payments表只需要每行有CostumerID,当然?编辑: 你可能会想要3张桌子。 Costumers,Payments和PaymentTypes(我试图明确表达我的表名)。

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

+0

这是一种付款方式。一种支付类型可以从多个客户使用。 – 2010-07-09 11:37:20

+0

啊,我现在明白了。我已经编辑了我的答案,以便更合适。 – 2010-07-09 12:35:41

1

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

这打破了关系数据库的normalization rules。千万不要做这样的事情。

0

您使用三张表。将客户信息存储在以CustomerId作为主键的“客户”表中。以PaymentId作为主键将付款存储在“付款”表中。然后使用一个名为“CustomerPayments”的连接表,它具有CustomerId和PaymentId的主键。
您不应该在Customer表中将PaymentId作为逗号分隔值存储。这不是一个规范化的数据库。请参阅http://en.wikipedia.org/wiki/First_normal_form

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

+1

您的技术建议非常好,正确。但我不认为最后需要非构造性的评论 - 我们都必须在很多年前的某个地方学习,当时我第一次遇到这样的设计问题,我希望有堆栈流问题。 – barrylloyd 2010-07-09 11:41:26

+3

抱歉,我不是故意批评这张海报,而是更多地看他的公司。随着各种信用卡安全违规组织的出现,我希望这些公司有经验丰富的人员来指导新的开发人员,而不是希望他们自己接受。安全是一件棘手的事情,后果非常严重。 – kanad 2010-07-09 11:49:19

0

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

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

1

首先,绝对不要像您提到的那样在一个字段中存储多个值。正如其他人所描述的,这是一个坏主意。

其次,我不清楚CostumerPayments表中包含什么。这是客户所做的个人付款(包括金额)吗?这些付款中的每一个都有与之相关的付款类型?

如果这是你想要的下表中的情况:

  1. 的costumers,与CostumerID的主键,并在所有没有提及支付。
  2. PaymentTypes,主键为PaymentTypeID,不支持付款或客户。
  3. CostumerPayments,CostumerID的外键指向Costumers表,第二个PaymentTypeID指向PaymentTypes表的外键。

要查找客户的所有付款,请查看CostumerPayments表,其中CostumerID = <>。要在同一个查询中获取客户信息和付款,请加入两个表Costumers和CostumerPayments。要查找付款类型的正确名称,请同时加入PaymentTypes表。

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

CostumerAllowedPaymentTypes,带有外键CostumerID和PaymentTypeID到它们各自的表中。