两张桌子还是一张桌子?

时间:2009-10-28 00:23:53

标签: sql database database-design data-modeling

关于桌子设计的一个简单问题..

假设我正在设计贷款申请数据库。 就像现在一样,我将有2张桌子..

申请人(ApplicantID,FirstName,LastName,SSN,Email ...) 和

共同申请人(CoApplicantID,FirstName,LastName,SSN,Email ..,ApplicantID)

我应该考虑只有一个表,因为所有字段都相同.. ??

(PersonID,FirstName,LastName,SSN,Email ...,ParentID(这决定了它是否是共同申请人))

这两种方法的优点和缺点是什么?

9 个答案:

答案 0 :(得分:6)

我建议使用以下数据模型:

PERSON

  • PERSON_ID,pk

LOAN_APPLICATIONS

  • APPLICATION_ID,pk

APPLICANT_TYPE_CODE

  • APPLICANT_TYPE_CODE,pk
  • APPLICANT_TYPE_CODE_DESCRIPTION

LOAN_APPLICANTS

  • APPLICATION_ID,pk,fk
  • PERSON_ID,pk,fk
  • APPLICANT_TYPE_CODE,fk
  

人(PersonID,FirstName,LastName,SSN,Email ...,ParentID(这决定了它是否是共同申请人))

如果一个人只有 作为申请人或共同申请人存在于您的系统中。一个人可以是众多贷款和/或申请人本人的共同申请人 - 您不希望每次都重新输入他们的详细信息。

这是如何&为什么事情正常化了。根据业务规则和使用的固有现实,表格设置,以便停止存储冗余数据。这是出于以下原因:

  1. 冗余数据浪费空间和空间。资源支持&保持
  2. 复制数据的行为意味着它也可能以微妙的方式有所不同 - 大写,空格等都可能导致复杂化以隔离真实数据
  3. 创建数据模型时由于疏忽而导致数据存储不正确
  4. 远见&灵活性。目前除申请人或共同申请人之外没有APPLICANT_TYPE_CODE价值的任何选项 - 它可以在不使用其他表格的情况下存储。外键。但是,此设置允许支持在将来根据需要添加不同的申请人代码 - 而不会对数据模型造成任何损害。
  5. 风险不佳时,没有性能优势。你会做什么,将被你必须执行的黑客吃掉才能让事情发挥作用。

答案 1 :(得分:4)

如果域模型确定这两个人都是申请人并且是相关的,那么他们就属于同一个表中,并带有自我引用的外键。

答案 2 :(得分:1)

您可能需要阅读database normalization

我认为你应该有两张桌子,但不是那两张桌子。有一张表“贷款”,其中有申请人表的外键,或只是申请人的记录参考同一张表。

答案 3 :(得分:1)

优点:    - 使搜索更容易:如果您只有电话号码或姓名,您仍然可以在一张表中搜索并找到相应的人,无论他/她是共同申请人还是主申请人。否则,您需要使用UNION构造。 (但是,当您知道搜索特定类型的申请人时,您会在类型上添加过滤器,而您只会获得此类申请人。    - 通常更容易维护。说明天你需要添加申请人的高音扬声器ID ;-),只有一个地方可以改变。    - 还允许输入具有“开放/未定义”类型的人,然后在以后指定为申请人或其他人。    - 允许引入新类型的申请人(比如说是合作的后期保证人......等等)......

缺点

  • 拥有非常庞大的(数百万人记录),可以通过两个表格方式获得轻微的性能提升(取决于索引和各种其他事项
  • SQL查询可能有点复杂,例如,对于person表有两个单独的连接,一个用于申请人,另一个用于共同申请人。 (没什么难以处理的,但更复杂。

总的来说,正确的设计最有可能是一张桌子。唯一可能的例外是,如果随着时间的推移,为一种类型的申请人保留的信息开始与申请人的其他类型显着不同。 (即便如此,我们也可以通过不同方式处理这种情况,包括为这些额外字段引入相关表格,因为它可能更有意义;是的,再次使用两个表系统,但是额外的字段可能适合“自然地“在语义,用法等方面一起......”

答案 4 :(得分:1)

您的两种变体都有一个缺点:任何人都可以是申请人和共同申请人两次或更多。所以你应该使用表Person(PersonID,FirstName,LastName,SSN,Email ...)和表共同申请人(PersonID作为申请人,PersonID作为CoApplicant)

答案 5 :(得分:0)

因为每个申请人都可以有一个共同申请人 - 所以只需要一张桌子。所以你有Applicants,它有一个可选的外键字段'coapplicant'(或类似的)。

答案 6 :(得分:0)

如果申请人和共同申请人之间的字段相同,那么我建议您将它们放在同一个表格中,并使用“申请人类型”字段来表明主要或共同申请人。如果有一些关于共同申请人的特殊信息(例如与主要申请人的关系,额外的电话号码,其他东西),您可能需要将其标准化为单独的表格并从那里返回共同申请人(通过(共同))申请人ID)在申请人表中。

答案 7 :(得分:0)

保持两张桌子> 1ST用户类型代码ID            在此表中,您可以保留用户类型,即applicat And Co申请人 第二表用户 - >在这里你可以使用类似的coloums保存所有字段,用户类型代码作为foregin键。           通过这个你可以轻松地在两个用户之间distingush。

答案 8 :(得分:-1)

我知道 - 我为时已晚......贷款申请是您的主要实体。您将有一个或多个贷款申请人。放弃人的想法 - 你正在创造一些你无法控制的东西。我去过那里,做到了,拿到了T恤。