Rails数据库和收入和支出模型

时间:2013-02-26 07:38:58

标签: ruby-on-rails models

我是Rails的新手,我正在试图找出如何创建模型来跟踪我的应用中的收入和支出。我应该:

1)创建一个名为Finance的模型和数据库表,然后设置一个名为" type"的字段。收入或费用,然后继续描述,金额,日期?

2)或者我应该创建两个模型和两个名为收入和支出的表,每个表都有描述,金额和日期?

我打算使用这些数据让摄影师跟踪与其业务相关的收入和支出。因此,例如当摄影师预约时,他们可以将收入和费用与该预约相关联。他们还可以查看显示月收入,费用和利润的报告。

2 个答案:

答案 0 :(得分:2)

我会说用一张表并使用STI(即使用类型字段).. 收入和支出本身都是一样的,只是操作的“方向”是不同的。所以对我来说,使用相同的数据模型是有意义的,异常隐藏在特定的子类型中。

现在关于其他答案中提到的问题:

  • 使用一张桌子可以轻松地同时订购这两件商品。两个人会很痛苦。
  • 正确索引表时,无论是一个还是两个表都无关紧要。在类型列上创建索引时,记录的基数与两个表中的基数相同,因此在性能方面并没有那么大的差别。使用一个表也可以更容易,更快地进行聚合。
  • 表锁定不是问题,除非你使用某种类型的数据库(如MyISAM),你不应该这样做。

答案 1 :(得分:1)

这基本上只是一个偏好问题。您可以使用一个或两个表(使用UNION)执行所有数据库查询。所以我更喜欢两个表,以获得更清晰的模型结构。你想要的图像如此保存收入条目:

  • 一张表:您始终必须设置类型
  • 两个表:您只需选择正确的模型

但我可以使用一个表来映像一个数据库查询,它可以(!)更快:

  • 如果你想ORDER两种类型,请按日期说。

另一点是一张桌子更好,但不适用于你的模型

  • 如果有无数种类型。或者:如果类型的数量可以改变。

对于其他一切,两个单独的表更好。关于查询性能:

  • 如果表变得非常庞大并且您想要检索所有收入条目,那么在具有300000个条目的表中查找这些条目当然比在具有600000个条目的表中查找更快。

深入了解DBMS,使用两个表的另一个原因是:

  • 表格锁定。一些数据库引擎锁定整个表以进行写操作。因此,只有一半的数据会被锁定,另一半仍然可以同时被访问。

我将看看有两个表的ORDER事物。也许我错了,性能影响甚至不存在。

结果:

我创建了三个简单的表(使用MySQL):

  • incid(int,PK),money(int,not null)
  • expid(int,PK),money(int,not null)
  • combiid(int,PK),type(tinyint,index,not null),money(非null)

然后用随机数据填充表格:

  • money:从1到10000
  • type:从1到2
  • inc:100000个条目
  • exp:100000个条目
  • combi:200000个条目

运行以下查询:

SELECT id, money
FROM combi
WHERE money > 5000
ORDER BY money
LIMIT 200000;

0,1秒......无索引:0,1秒

SELECT * FROM (
    SELECT id, money FROM inc WHERE money > 5000
    UNION
    SELECT id, money FROM exp WHERE money > 5000
) a
ORDER BY money LIMIT 200000;

0,16秒

SELECT id, money
FROM combi
WHERE money > 5000 && type = 1
ORDER BY money
LIMIT 200000;

0,14秒......没有指数:0,085秒

SELECT id, money
FROM inc
WHERE money > 5000
ORDER BY money
LIMIT 200000;

0,04秒

你可以看到预期的结果:

  • 当您在一个查询中需要收入和支出时,则一个表更快
  • 当你只需要收入或费用时,那么两张表就更快

但是我不明白:为什么查询type = 1这么慢?我认为使用索引会使它几乎快速相等吗?