2012-12-27 93 views
1

这是有点难以解释,所以请裸露在我身边。在SQL连接交易表与不同种类的交易

我正在为一家餐厅制作一个mysql数据库。

我有一个表格叫做:*tbl_contents*,它存储了用于准备不同菜单项目的所有内容。
现在我必须为所有的支出维护一张桌子。这些支出可以是“购买内容”或一些经常性开支,如电费单或餐厅的租金。

如何将两种支出存储在同一张表中?

我有表tbl_fixed_expanditurestbl_contents。 如果我为厨房买东西,它应该存储在tbl_contents,如果我已经支付了电费,它将被保存在tbl_fixed_expenditures

enter image description here

+2

有什么实际问题?您是否担心规范化,因为这两类项目(固定资产和可变资产)具有不同的属性/列? – theMarceloR

+1

是的,这是关于正常化(不要问我哪一个:P),但我不知道如何去做。我有这张表需要节省这两种支出的表expenditures_tranx。 –

+1

我不确定我是否理解这个问题。如果你想把所有的支出都放在一张桌子上,但需要区分它们,那么标志(内容= y或n)就是要走的路。 – mikeY

回答

1

你基本上试图在关系数据库中表示继承。

你有两个“类”在某些方面是相似的,而在其他方面是不同的。我的建议是创建一个表,充当tbl_expanditurestbl_fixed_expanditures的父级。

这里是我会做:

+------------------+ 
| tbl_expenditures | 
+------------------+ 
| id    | 
+------------------+ 

+------------------------+ 
| tbl_fixed_expenditures | 
+------------------------+ 
| id      | 
| expenditureId   | 
| ...     | 
+------------------------+ 

+---------------------------+ 
| tbl_variable_expenditures | 
+---------------------------+ 
| id      | 
| expenditureId    | 
| ...      | 
+---------------------------+ 

...其中tbl_fixed_expenditures.expenditureIdtbl_variable_expenditures.expenditureId都必须tbl_expenditures.id参考。

这样,当您需要将它们简称为“支出”(例如,在您的交易表中)时,您可以参考tbl_expenditures,并且当您需要固定或可变支出独有的信息时,您可以参考“孩子”表。

这是关系数据库的一个非常普遍的问题,并且有几种处理方法,每种方法都有其优点和缺点。IBM有一个非常好的文章,概述这些选项,我强烈建议进一步阅读:

http://www.ibm.com/developerworks/library/ws-mapping-to-rdb/

1

嗯,这是一种很难给出一个合适的答案,但我可以给你根据什么我目前了解一些模糊的猜测。

如果这两种支出具有不同的属性,但它们有一些共同的细节,则应对表格进行归一化。使用expenditures_tranx作为中间表(就像OO术语中的顶级类),其余表tbl_fixed_expanditurestbl_contents可以是“专用”表(同样,以OO术语,将“继承”属性从父表中)将存储更详细的支出信息。这里有一个简单的模型实体关系草案来说明。

____________   ___________________  _______________________  
    |tbl_contents|-1----*-| expenditures_tranx|-*---1-|tbl_fixed_expenditures| 
    |exp_id:fk___|  |___________________|  |exp_id:fk_____________| 

下面是解释这些概念的有趣文章: http://apps.topcoder.com/wiki/display/training/Entity+Relationship+Modeling

让我知道你在想什么。

+0

但这是否意味着桌子支出_tranx将有两个FK?一旦从tbl_cnotents和一个来自tbl_fixed_expenditures? –

+1

如果这是你正在寻找的基数,是的,中间表将照顾外键,因为它将成为收集支出列表的入口点。 – theMarceloR

+0

但这似乎没有规范化,以便在表中始终有一个空的控件。我的意思是如果我输入一个内容支出,它将把固定支出的FK留空,反之亦然。 –