我是Rails的新手,我正在试图找出如何创建模型来跟踪我的应用中的收入和支出。我应该:
1)创建一个名为Finance的模型和数据库表,然后设置一个名为" type"的字段。收入或费用,然后继续描述,金额,日期?
2)或者我应该创建两个模型和两个名为收入和支出的表,每个表都有描述,金额和日期?
我打算使用这些数据让摄影师跟踪与其业务相关的收入和支出。因此,例如当摄影师预约时,他们可以将收入和费用与该预约相关联。他们还可以查看显示月收入,费用和利润的报告。
答案 0 :(得分:2)
我会说用一张表并使用STI(即使用类型字段).. 收入和支出本身都是一样的,只是操作的“方向”是不同的。所以对我来说,使用相同的数据模型是有意义的,异常隐藏在特定的子类型中。
现在关于其他答案中提到的问题:
答案 1 :(得分:1)
这基本上只是一个偏好问题。您可以使用一个或两个表(使用UNION)执行所有数据库查询。所以我更喜欢两个表,以获得更清晰的模型结构。你想要的图像如此保存收入条目:
但我可以使用一个表来映像一个数据库查询,它可以(!)更快:
ORDER
两种类型,请按日期说。另一点是一张桌子更好,但不适用于你的模型:
对于其他一切,两个单独的表更好。关于查询性能:
深入了解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
(非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
这么慢?我认为使用索引会使它几乎快速相等吗?