【问题标题】:Normalize SQL database规范化 SQL 数据库
【发布时间】:2011-11-17 03:55:24
【问题描述】:

我正在为一个项目创建一个数据库,但我对规范化如何应用于我的架构有点困惑。每次为客户批准贷款时,他们都有支票或 EFT 两种选择,所以我想知道贷款是支票还是 EFT。

这是我的 3 张桌子:

贷款

id_loan (PK)
product
amount 
status

检查

id_check (PK)
id_customer
amount

电子转帐

id_eft (PK)
id_customer
amount

然后我创建了第 4 个表来建立贷款和货币处置之间的关系。

处置

id_payment (PK)
id_loan (FK loans)
id_disposal (FK checks or EFT)
disposal_type

在此表中,我存储贷款是否与支票或 EFT 相关,disposal_type 字段是具有两个可能值“check”或“EFT”的 varchar。 id_disposal 字段充当两个表的外键。

问题是我认为我的数据库没有使用这种结构进行标准化,对吗?解决这个问题的最佳方法是什么?

【问题讨论】:

  • 您是否总是通过一张支票或一张电子转帐向获得贷款的人支付一笔款项?
  • 不,有些贷款可能需要不止一张支票或电子转帐,甚至两者都需要
  • "id_disposal (FK checks or EFT)" -- 这是一个设计问题:您不能定义这样的 FK,因为 id_eft 和 id_customer 是不同的逻辑类型,即使它们恰好属于相同的 SQL 数据类型。您需要一个进一步的超类型表。 Google for SQL 子类化。但是,您的问题与规范化无关。
  • 谢谢有一天我就是这样解决这个问题的

标签: sql sql-server-2008 normalization


【解决方案1】:

你需要类似附件的东西。请注意,customer_loans 表有点无关紧要,而且有点矫枉过正,但如果有任何列与客户和贷款相关,而不是与客户的贷款付款相关,那就是它的所在。

【讨论】:

  • 感谢您的快速回复 Wil,事实上有些字段我没有考虑,但现在我知道如何使用您的架构添加它们。
  • 真正的问题是支票和电子转帐都有身份,支付应用程序需要以某种程度的完整性存储它。支票有支票号码; EFT 还有其他东西。
  • Catcall - 支票号码和 EFT 号码是外部标识符,可以这样处理。它们不能唯一标识付款……例如,两家银行可以签发相同的支票号码。然而,payment 可以通过客户、金额、支付方式等唯一标识。剥猫皮的方法有很多种,但 Jorge 需要的模式可以通过将 3NF 粉碎来创建.
【解决方案2】:

在对象世界中,您会为此使用继承。会有一个基本类型 Disposal,CheckDisposal 和 EftDisposal 将从该类型派生。现代 O/RM 支持多种技术将其映射到关系结构。

TablePerHierarchy 将所有记录放入带有鉴别器列的单个表中,以识别特定记录保存和映射到的类型。优点是它需要更少的连接来获取记录。缺点是它需要应用逻辑来强制数据完整性。

TablePerType 将记录映射到具有 fk 关系的不同表中,并返回到基表。当然,这需要更多的连接(尤其是对于深层次或宽层次结构),但可以在数据库中强制执行数据完整性。

【讨论】:

  • 对实体使用 linq 怎么样?
  • 实体框架支持这两种策略。您是否首先使用 4.1 代码? (我推荐)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-18
  • 2011-04-05
  • 2011-09-28
  • 2012-10-08
  • 2012-06-21
相关资源
最近更新 更多