Ruby on rails Rails数据库和收支模型
我是Rails的新手,正在尝试找出如何在我的应用程序中创建模型来跟踪收入和支出。我应该: 1) 创建一个名为Finance的模型和数据库表,然后将名为“type”的字段设置为income或expense,然后继续说明、金额、日期 2) 或者我应该创建两个模型和两个名为收入和支出的表格,每个都有描述、金额和日期Ruby on rails Rails数据库和收支模型,ruby-on-rails,models,Ruby On Rails,Models,我是Rails的新手,正在尝试找出如何在我的应用程序中创建模型来跟踪收入和支出。我应该: 1) 创建一个名为Finance的模型和数据库表,然后将名为“type”的字段设置为income或expense,然后继续说明、金额、日期 2) 或者我应该创建两个模型和两个名为收入和支出的表格,每个都有描述、金额和日期 我打算利用这些数据让摄影师追踪与他们的业务相关的收入和支出。例如,当摄影师预约时,他们可以将收入和费用与预约联系起来。他们还可以看到一份显示每月收入、支出和利润的报告 这基本上只是偏好的问
我打算利用这些数据让摄影师追踪与他们的业务相关的收入和支出。例如,当摄影师预约时,他们可以将收入和费用与预约联系起来。他们还可以看到一份显示每月收入、支出和利润的报告 这基本上只是偏好的问题。您可以使用一个或两个表(使用UNION)执行所有数据库查询。所以我希望两个表有一个更干净的模型结构。您想要的图像,请保存收入条目:
- 一张表:您必须始终设置类型
- 两张表:您只需选择正确的型号
- 如果您想
订购这两种类型,就让我们说按日期
- 如果有无限多的类型。或者:如果类型的数量可以更改
- 如果表变得非常庞大,例如,您希望检索所有收入条目,那么在一个有300000条目的表中查找这些条目当然要比在一个有600000条目的表中查找这些条目更快
- 表锁定。一些数据库引擎为写操作锁定整个表。因此,只有一半的数据会被锁定,而另一半仍然可以同时访问
我将看一看带有两个表的
ORDER
东西。也许我错了,而且对性能的影响根本不存在
结果:
我已经创建了三个简单的表(使用MySQL):
:inc
(int,PK),id
(int,非空)money
:exp
(int,PK),id
(int,非空)money
:combi
(int,PK),id
(tinyint,index,非空),类型
(非空)货币
:从1到10000货币
:从1到2类型
:100000条条目inc
:100000个条目exp
:200000个条目combi
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通常在构建查询计划时选择一个索引,这意味着如果在查询条件中有两个字段,并且两个字段上都有单独的索引,则只使用一个。这就是为什么您应该始终在最常用的列上创建复合索引。同样,这样的计时测试也毫无价值,因为查询速度取决于索引+索引基数,这是用很少的记录无法模拟的。分析将更有用,更具信息性。