2

一段时间以来,我一直推迟开发我的应用程序的这一部分,纯粹是因为我想以一种循环的方式来做这件事,但是从我记得我的讲师在学校告诉我的事情中感觉这是一个坏主意。

我有一个订单系统的设计,忽略了与这个示例无关的所有内容:

  • 信用卡
  • 顾客
  • 命令

我想要这样,

  • 客户可以有信用卡(0-n)
  • 客户有订单(1-n)
  • 订单有一位客户(1-1)
  • 订单有一张信用卡(1-1)
  • 信用卡可以有一个客户(1-1)(唯一的 id,所以我们可以忽略 cc 号码的唯一性,丈夫/妻子可以共享 cc 实例等)

基本上最后一部分是问题出现的地方,有时信用卡被拒绝并且他们希望使用不同的信用卡,这需要更新他们的“当前”卡,但这只能更改用于该订单的当前卡,而不是客户可能在磁盘上的其他订单。

这有效地在三个表之间创建了一个圆形设计。

可能的解决方案:要么

创建圆形设计,提供参考:

  • cc 参考订购,
  • 客户参考抄送
  • 客户参考订购

或者

  • 客户参考抄送
  • 客户参考订购
  • 创建引用所有三个表 id 的新表并在订单上放置唯一的,以便在任何时候只有一个 cc 可能是该订单的最新

本质上,两者都对相同的设计进行建模,但翻译方式不同,此时我最喜欢后一种选择,因为它看起来不那么圆,更中心化。(如果这有道理的话)

我的问题是,

  • 如果有的话,每个人的优点和缺点是什么?
  • 循环关系/依赖的陷阱是什么?
  • 这是该规则的有效例外吗?
  • 有什么理由我应该选择前者而不是后者?

谢谢,让我知道您是否需要澄清/解释任何事情。

--更新/编辑--

我注意到我所说的要求中有一个错误。在尝试为 SO 简化事情时基本上丢球了。Payments 那里还有另一个表,它增加了另一个层。问题是,订单可以进行多次付款,并且可以使用不同的信用卡。(如果您真的想知道其他付款方式)。

在这里说明这一点是因为我认为根本问题仍然是相同的,而这只确实增加了另一层复杂性。

4

5 回答 5

7

一个客户可以关联 0 个或多个信用卡,但关联是动态的 - 它可以来来去去。正如您指出的那样,一张信用卡可以与多个客户相关联。所以这最终是一个 n:m 表,可能带有“活动”的标志列。

一个订单与 0 或 1 张信用卡有静态关系,并且在一次销售完成后,你不能乱动 cc 值,无论 cc 与客户之间的关系发生什么变化。订单表应在销售时独立存储有关 cc 的所有相关信息。没有理由将销售与任何其他表中的任何其他信用卡列相关联(这可能会改变 - 但不会影响销售)。

于 2009-04-27T00:16:53.193 回答
1

唔?

一个客户有几张信用卡,但只有一张当前的。一个订单有一个分配的卡片。顾客买东西时,先试他的默认卡,否则他可能会更换他的主卡?

我在这里看不到循环引用;当用户的信用卡发生变化时,他的订单保持不变。你的桌子最终会变成:

  • 客户:身份证,当前卡
  • 信用卡:id、number、customer_id
  • 订单:id、Card_id、Customer_id

编辑:哎呀,忘记了一个字段,谢谢。

于 2009-04-27T00:17:42.693 回答
1

我认为问题在于订单的建模。一个订单应该能够与一张以上的信用卡关联,而不是一个订单只有一张信用卡,而其中一张信用卡在任何时候都处于活动状态。本质上,订单和信用是多对多的。为了在 DB 中对此进行建模,您需要引入一个关联表,比如 PaymentHistory。现在,当订单需要新信用卡时,您可以简单地创建一张新信用卡,并将其与订单关联,并将关联的 PaymentHistory 标记为活动。

于 2009-04-27T00:24:30.913 回答
0

无论您的数据具有循环关系的原因是什么,如果您“忘记”声明其中一个以使您的表具有批量加载顺序,您会更开心。

当您最不期望它时,它会派上用场。

于 2009-04-27T00:24:40.057 回答
0

这是一岁,但有一些值得一提的观点。

NB 对于在线非账户流程:客户最好定义为买方,并且可能还有另一种类型的客户 - 受益人/收件人。您可以为其他人购买/购买机票和鲜花等,因此这两个角色需要明确区分,因为它们涉及不同的业务流程(一个是支付,另一个是发送货物)。

如果这是一个非帐户流程,那么您不应该保留信用卡详细信息。这是一个安全风险——你保留这些信息会让买家处于风险之中。信用卡是实时处理的,然后信息应该被丢弃。

帐户客户:唯一的例外是当有人开设帐户并提供他们的信用卡信息以供后续购买时使用。在这种情况下,信用卡信息的更改将在交易之外发生 - 作为账户管理流程的一部分。

要点是确保在开始建模和编码之前完全了解业务流程。

于 2010-05-29T00:46:30.547 回答