Fundjour的数据结构

先设计好数据结构,然后在数据库里把表建立起来。这样即使前端部分还在写,我一样可以通过直接操作SQL来记录需要记录的东西,可以给前端部分的开发更多的时间。

一条记录的字段应当大致有这样几个:

ID     作为每笔收支的真正的标识符

DATE  日期

TIME   时间

BALANCE  数额

TYPE  币种

IO   收或支,标记一个方向

FT   From/To,记录从哪里来或者到哪里去

USAGE  用途,缘由

日期和时间那里是分开还是合并呢?各有优劣。暂时先决定分开吧,以后看情况。

以上是一条记录应当有的结构。如果建表的话,还需要加入两个字段,一个是表主键,一个是记录的时间。加入表主键而不使用记录的那个ID是因为我想让记录的ID保持紧凑中间不要跳号。表主键就无所谓了。不过这点也许还需要再考虑。 加入记录时间则是因为发生时间和记录时间肯定会不一致的。都在当天也就罢了,要是隔天记录的话,只有一个时间会让统计失去意义的。

最后应当大致如此:

CREATE TABLE fundjour (

  ID  int ,  --- primary Key

  RID int,   -- record id

  DATE  date ,

  TIME  date,

  BALANCE number,

  TYPE varchar,

  IO  int,

 FT  varchar,

 USAGE varchar,

RECORD_TIME date default sysdate  -- 记录时间

)

 

 

准备写个记账用的东西

准备写个记账用的东西,不然不利于培养理财意识。已经半只脚在金融界的了,总得专业点吧。

带图形界面的编程是我的弱项,短时间内根本没法解决,索性回避吧。直接写个命令行操作的,用起来也能更省事更随心所欲一些。

这个东西的要求首先得要足够简洁和方便。每次打字一定要足够少。不然我直接往数据库里写SQL,功能还能更强大更灵活一些。然后得足够地灵活,不要太死板地限制我的输入。虽然多数时候我要求打字少,但也应当支持我话痨的时候。这个东西的功能暂时不需要太多,太多我也想不出来,只要基本的吧。大致应该有以下几个:

1. 资金来往记录的增删查改。

2. 各种分类统计功能。

技术选型还没想好。是把账目都写在文本里面还是弄到数据库里面去也没想好。这个一边做一边考虑吧。先描绘下想要的效果:

1.名字初定为fundjour,命令行输入fdj可调出。

2.调出来的当以 fdj > 打头,其后可输入具体指令操作。

2.1. 操作的指令不要写死,应当有一张列表,可随时修改。

2.2. "fdj > got 3000RMB: expense of Sep."  类似这样的一条表示入账了3000块。冒号后面为原因。这个冒号后面为因由就定死吧,太灵活的话写起来会比较困难。

2.3. 因为操作指令不写死,那么自然应当支持多种同义词。比如说 "fdj > add 3000RMB" 

2.4. 应当支持多点废话,比如说"fdj > I got 3000RMB from company for expense of Septempber"。 这里应当能够正确识别出关键字"got","from","for"。 当然这个要先写到操作指令列表里面去。最前面那个纯废话的"I",应当能被无视。

2.5. 是否应当支持颠倒的顺序呢?还在犹豫…… 比如说 "From company I got 3000RMB as expense of September", 这样的应当可以支持吧,但是那个"I" 在这里会比较碍事。 而另一种比如说"Company paid me 3000RMB as expense of September" 这样的,我暂时没办法解析了。算了,颠倒顺序这点就先砍掉吧,等我在自然语言处理上有所成了再回炉。

3. 应当支持直接以命令方式使用,不需要先行进入fdj > 的shell。 命令方式的格式如下:fdj [detail]。比如说" fdj got 3000RMB "。 如果 [detail]为空白,那么默认显示当前月份的账目。

4. 上面写的时候设想的场景都是增加一条记录的,但这个是最简单的。其他的查删改都要难一些。查的话,关键操作符还是一样,由列表指定,具体查询条件应当支持 (1)时间和时间段,(2)缘由的模糊匹配,(3)大致的类别,(4)金额区间,(5)入账出账,(6)分类统计的输出。 具体怎么实现是个问题,就连怎么区分这6类也是个需要考虑的问题。给六类分别指定个不同的指令么?还是带参数?还是统统写在一起让它自己解析?

5.删除功能不需要太灵活。删除的作用本质上是删掉误输入的记录。就给两种格式吧:(1)删除上N条。或者删除上N至M条,或者删除上N,M,X,Y,Z条,或者多个区间。(2)删除记录的某个ID号,某个ID区间,某几个ID号,某几个ID区间。

6.修改功能还没想好。感觉这东西要按命令行的方式来操作的话有点类似在ed中编辑一样,会很憋屈。要不要考虑把那要改的记录搞进vim里,然后改完保存了再提交回去呢?

7. 各种查询统计,也放到指令列表里,对应到具体的统计方式。这货应当是个不断扩展的,光凭现在想必然没法想全了。到时候想到一个加一个进去吧,方便扩展。

 

从上面看,似乎不用数据库不太现实了。那就弄个数据库吧。前端把字符处理完后,将真正的内容都整进数据库里,然后到数据库里编辑各种统计的业务逻辑,给前端调用,大致就这么个方式吧。只不过这样一来,跨数据库平台就不太好跨了。算了,反正也就我自己用用,不跨也不要紧。SQLite不知道支不支持存储过程,要足够强大的话就用它;要是不行的话就用PostgreSQL。 Oracle虽然好并且我熟悉,但是Gentoo上安装会有麻烦。

前端的输入字符处理会是个难点,具体怎么实现我还得好好想想……