我有一个桌面应用程序,它具有一个名为Field
.
-----------------------
| Id | FieldName |
-----------------------
| 1 | "Field 1" |
-----------------------
| 2 | "Field 2" |
-----------------------
Field
s 是由用户定义的,因此用户可以根据需要设置任意多个。它们与另一个名为 的实体相关联Employee
。
Field
s 对于一年中的每一天都有一个值(由应用程序计算和存储的 16 位整数)。
Field
值存储在一个表中,其中每条记录都保存了一整年的值Employee
one Field
。
因此,该表看起来有点像这样:
---------------------------------------------
| FieldId | EmployeeId | FieldValues | Year |
---------------------------------------------
| 1 | 4 | byte[] | 2012 |
---------------------------------------------
| 2 | 4 | byte[] | 2012 |
---------------------------------------------
| 1 | 5 | byte[] | 2013 |
---------------------------------------------
| ... | ... | ... | ... |
---------------------------------------------
FieldValues 将值作为字节数组保存在 BLOB 字段中,然后将其转换回 16 位整数数组,然后在网格上显示给用户。
现在我们有了一些背景,真正的问题。
这是一个遗留应用程序,我不是原始设计师。不过,很容易猜到,以二进制格式存储这些数据的目的是限制记录的数量,否则每年Employee
每个Field
.
我现在正在做的是一个“同步”应用程序,它从本地 Access 数据库中提取这些数据(不要问),并通过 REST API 将其推送到远程服务器上的 Web 应用程序。这样的应用程序需要有这个数据的副本,所以我必须将它存储在它的数据库中。
以二进制格式存储数据的明显优势是真正限制了我们需要存储的记录数量,但缺点是人类不可读。
另一方面,Web 应用程序是多租户的,因此以任何其他方式存储这些数据都意味着存储大量记录:仅仅几千Employee
秒,平均 20Field
秒意味着存储超过 1400 万条记录年(并且Fields
不是唯一可以生成数百万条记录的实体)。另外,如果在未来的某个地方,比如说每两三年,我们可以把它们扔掉,那么每年的大量记录本身就不是问题;然而,事实并非如此。
那么,真正的问题是如何存储所述数据。我应该坚持旧格式吗?
谁能想到一种完全不同的方式来解决它?
为了完整起见,尽管我认为这并不重要,但目标数据库是 Postgres。