单个或多个表

这应该在数据库中表示为1个表格还是3个表格? 我和我的朋友对此有不同的看法,所以我想看看这方面的一般看法。 (也许它应该是对任一解决方案的投票?)

Create Table Order
// Basic fields of the table
 - ID (Primary key)
 - CustomerID  (integer, with a FK)
 - Quantity
 - ProductID  (integer, with a FK)

 // Then depending on user selection, either these fields need to be specified 
 // (could be factored out to a separate table):
 {
 - InternalAccountID (integer, with a FK)
 - InternalCompanyID (integer, with a FK)
 }

 // Or these (could be factored out to a separate table):
 {
 - ExternalAccountNumber (free text string)
 - ExternalCompanyName (free text string)
 - ExtraInformation (free text string)
 }

1表方法:

优点:

  • 表现(一个插入而不是两个,FK检查,没有连接)
  • 可能需要更少的空间(额外的表具有开销+索引+额外的ID字段)
  • 一张桌子,而不是三张桌子
  • 几乎没有理由为2 + 3字段拆分新表(或什么?)
  • 缺点:

  • 可空字段
  • 可能多余的“类型”列(可以跳过)
  • 打破3NF(?)
  • 优点和缺点善意要求以及个人意见。 :)

    编辑:我试图通过使用不同的实体来简化示例,而不是实际使用,所以任何改变模型的建议都不会真的帮到我。 请关注技术方面,而不是域模型。


    我的意见是,如果

     // Then depending on user selection, either these fields need to be specified 
     // (could be factored out to a separate table):
     {
     - InternalAccountID (integer, with a FK)
     - InternalCompanyID (integer, with a FK)
     }
    
     // Or these (could be factored out to a separate table):
     {
     - ExternalAccountNumber (free text string)
     - ExternalCompanyName (free text string)
     - ExtraInformation (free text string)
     }
    

    总是与订单1:1(即,你不能有3个accountIDs),然后把它作为一个表。 为了照顾你的空问题,你可以添加一个名为InternalCustomer(boolean)或CustomerType(varChar)的列,你可以使用它来定义一个内部或外部客户,以知道你应该查看两组字段中的哪一个特定的客户。

    由于我们不知道如何充分利用这些数据或整个数据库的模式,因此对此的任何响应都无法完全确定。


    希望这是不言自明的。

    order_model_v1


    如果你想避免数据重复,你应该使用2或3表解决方案。 例如,如果订单表中有External列,则值可能存在多次。 如果数据如下所示:

    ID   ExternalCompanyName
    1    ACME
    2    ACME
    3    My Company
    4    ACME
    

    现在,如果ACME将名称更改为ACME,Inc.,则必须更新许多行。 如果表格规范化,外部公司在单独的表格中,您将更新一行。 请注意,可能有一个参数将Account Number放在它自己的表中,但是我们会将其保留为极端的标准化。

    它似乎不是订单和公司/账户之间的一对一关系,除非每个公司/账户只能有一个订单。 这听起来更像是一对多的关系。

    现在,如果在单表环境中更新ExternalCompanyName时发生错误,并且只更新了一部分行,会发生什么情况。 你有一些行与ACME和一些行与ACME,Inc.你最终的数据不好的情况。

    而且,如果这确实是一对多的关系,那么你实际上并没有节省空间。 您按顺序复制数据,而不是将其存储在另一个表中。

    链接地址: http://www.djcxy.com/p/70609.html

    上一篇: single or multiple tables

    下一篇: Syntax of Keras Functional API