Ruby on rails Rails数据库和收支模型

Ruby on rails Rails数据库和收支模型,ruby-on-rails,models,Ruby On Rails,Models,我是Rails的新手,正在尝试找出如何在我的应用程序中创建模型来跟踪收入和支出。我应该: 1) 创建一个名为Finance的模型和数据库表,然后将名为“type”的字段设置为income或expense,然后继续说明、金额、日期 2) 或者我应该创建两个模型和两个名为收入和支出的表格,每个都有描述、金额和日期 我打算利用这些数据让摄影师追踪与他们的业务相关的收入和支出。例如,当摄影师预约时,他们可以将收入和费用与预约联系起来。他们还可以看到一份显示每月收入、支出和利润的报告 这基本上只是偏好的问

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

1) 创建一个名为Finance的模型和数据库表,然后将名为“type”的字段设置为income或expense,然后继续说明、金额、日期

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


我打算利用这些数据让摄影师追踪与他们的业务相关的收入和支出。例如,当摄影师预约时,他们可以将收入和费用与预约联系起来。他们还可以看到一份显示每月收入、支出和利润的报告

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

  • 一张表:您必须始终设置类型
  • 两张表:您只需选择正确的型号
但我可以想象一个数据库查询,如果只使用一个表,它可以(!)更快:

  • 如果您想
    订购这两种类型,就让我们说按日期
还有一点,一张表更好,但这不适用于您的模型:

  • 如果有无限多的类型。或者:如果类型的数量可以更改
除此之外,两张单独的桌子更好。关于查询性能:

  • 如果表变得非常庞大,例如,您希望检索所有收入条目,那么在一个有300000条目的表中查找这些条目当然要比在一个有600000条目的表中查找这些条目更快
深入了解DBMS后,使用两个表还有另一个原因:

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

我将看一看带有两个表的
ORDER
东西。也许我错了,而且对性能的影响根本不存在

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

  • inc
    id
    (int,PK),
    money
    (int,非空)
  • exp
    id
    (int,PK),
    money
    (int,非空)
  • combi
    id
    (int,PK),
    类型
    (tinyint,index,非空),
    货币
    (非空)
然后用随机数据填充表格:

  • 货币
    :从1到10000
  • 类型
    :从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秒。。。无索引:0085秒

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

您可以看到预期的结果:

  • 当您在一个查询中需要收入和支出时,一个表的速度更快
  • 当你只需要收入或支出时,两张桌子更快

但我不明白的是:为什么
type=1
的查询速度要慢得多?我认为使用索引会使其速度几乎相等?

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

关于另一个答复中提到的问题:

  • 使用一张桌子,同时订购两种物品变得很容易。两个人在一起会很痛苦
  • 在正确索引表时,它是一个表还是两个表并不重要。在类型列上创建索引时,记录的基数与两个表中的相同,因此在性能方面没有太大差异。使用一个表,聚合将更容易、更快
  • 表锁定不是问题,除非您使用某种类型的数据库(如MyISAM),而您不应该这样做

我已经更新了我的帖子。我运行了一些基准测试。但是在类型上使用索引的结果出人意料地慢?!谢谢你的回复。我将按照您的建议使用一个表。我创建了另一个表
combi2
,没有类型索引。它更快。我无法解释。结果将在我的答案中编辑。感谢您的完整答案和速度测试。我将使用一个表,因为我通常需要按日期排序。RDBMS通常在构建查询计划时选择一个索引,这意味着如果在查询条件中有两个字段,并且两个字段上都有单独的索引,则只使用一个。这就是为什么您应该始终在最常用的列上创建复合索引。同样,这样的计时测试也毫无价值,因为查询速度取决于索引+索引基数,这是用很少的记录无法模拟的。分析将更有用,更具信息性。