1

我是 Rails 的新手,正在尝试弄清楚如何创建模型来跟踪我的应用程序中的收入和支出。我是不是该:

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

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

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

4

2 回答 2

2

我会说一张桌子并使用STI(即使用类型字段)。收入和支出本质上是一回事,只是操作的“方向”不同。所以对我来说,使用相同的数据模型是有意义的,例外隐藏在特定的子类型中。

现在至于另一个答案中提到的问题:

  • 一张桌子同时订购这两种物品变得很容易。两个人会很痛苦。
  • 正确索引表时,一张或两张表都没有关系。在 type 列上创建索引时,记录的基数与在两个表中的基数相同,因此在性能方面并没有太大差异。使用一张表进行聚合也将更加轻松快捷。
  • 表锁定不是问题,除非您使用某种您不应该使用的数据库(如 MyISAM)。
于 2013-02-26T09:19:36.943 回答
1

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

  • 一张表:您始终必须设置类型
  • 两张桌子:您只需要选择正确的型号

但是我可以想象一个数据库查询,它可以(!)只使用一个表来更快:

  • 如果你想要ORDER两种类型,让我们按日期说。

还有一点是一张桌子更好,但这不适用于您的模型

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

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

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

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

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

ORDER我会用两张桌子来看看这个东西。也许我错了,性能影响甚至不存在。

结果:

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

  • inc: id(int, PK), money(int, not null)
  • exp: id(int, PK), money(int, not null)
  • combi: id(int, PK), type(tinyint, index, not null), money(not 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 sec ... 无索引:0,1 sec

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速度这么慢?我认为使用索引会使它几乎等于快?

于 2013-02-26T09:02:36.013 回答