把两个数据库表变成一个?

时间:2014-07-14 17:52:36

标签: sql database database-design orm

在将关系数据库建模到库存管理系统时,我遇到了一些麻烦。目前,它只有3个简单的表:

  1. 产品

    ID | Name | Price
    
  2. Receivings

    ID | Date | Quantity | Product_ID (FK)
    
  3. 销售

    ID | Date | Quantity | Product_ID (FK)
    
  4. 由于收货和销售相同,我正在考虑采用不同的方法:

    1. 产品

      ID | Name | Price
      
    2. Receivings_Sales(名称无关紧要)

      ID | Date | Quantity | Type | Product_ID (FK)
      
    3. 列类型将标识它是正在接收还是销售。

      任何人都可以帮我选择最佳选择,指出这两种方法的优缺点吗? 第一个似乎是合理的,因为我正在以ORM的方式思考。

      谢谢!

3 个答案:

答案 0 :(得分:3)

我个人更喜欢第一个选项,即SalesReceiving的单独表格。

选项编号2中的两个最大缺点或将两个表合并为一个:

1) Inflexibility
2) Unnecessary filtering when use

首先是缺乏灵活性。如果您的需求扩展了(或者您只是忽略了它),那么您将不得不打破您的架构,否则您将最终得到非标准化的表。例如,假设您的销售现在包括执行销售交易的销售员/人员,因此显然它与'Receiving'无关。如果你做零售或批发销售怎么办?你会如何在合并的表中容纳它?折扣或促销怎么样?现在,我在这里找到了明显的证据。现在,我们转到Receiving。如果我们希望将收到的内容绑定到Purchase Order,该怎么办?显然,购买订单详情如P.O.号码,P.O。日期,供应商名称等不在Sales下,但显然与Receiving有关。

其次,在使用时进行不必要的过滤。如果您已合并表并且只想使用表的Sales(或Receving)部分,那么您必须通过后端或前端程序过滤掉接收部分。如果它是一个单独的表,你只需要一次处理一个表。

此外,您提到ORM,第一个选项最适合该项目,因为显然该事项的对象或实体应与其他实体/对象不同。

答案 1 :(得分:1)

如果 这些表确实并且始终是相同的(我有疑问),那么将统一表命名为更通用的表,例如“InventoryTransaction”,以及然后对其中一种交易类型使用负数:可能是销售额,因为这样可以正确地标记您的库存,以便跟踪库存情况。

答案 2 :(得分:0)

标题相同的事实是无关。寻求使用单个表,因为标题是相同的误解

-- person [source] loves person [target]
LOVES(source,target)

-- person [source] hates person [target]
HATES(source,target)

每个基表都有一个相应的谓词 aka fill-in-[named-]空白语句,用于描述应用程序的情况。基表保存了生成真实语句的行。

每个查询表达式通过JOIN,UNION,SELECT,EXCEPT,WHERE condition 等组合基表名,并且有一个相应的谓词,它通过(分别)AND,OR,EXISTS组合基表谓词, AND NOT,AND condition 等。查询结果保存了生成真实语句的行。

这样一组满足谓词的行是 关系 。没有其他理由将行放在表格中。

(其他答案在这里解决,因为它们必须,你的一个表可能有的谓词的建议和后果。但如果你因为它的谓词没有提出表格,为什么你提出它呢?答案是,因为不是出于谓词,没有充分的理由。)