我目前正在尝试修改与 postgres 数据库交互的现有 API。长话短说,它本质上是存储描述符/元数据,以确定实际“资产”(通常是某种文件)在服务器硬盘上的存储位置。
目前,可以使用任意数量的未定义键值对(即 uploadBy、addOn、assetType 等)对这些“资产”进行“标记” 。这些标记存储在一个单独的表中,其结构类似于以下:
+---------------+----------------+-------------+
|assetid (text) | tagid(integer) | value(text) |
|---------------+----------------+-------------|
|someStringValue| 1234 | someValue |
|---------------+----------------+-------------|
|aDiffStringKey | 1235 | a username |
|---------------+----------------+-------------|
|aDiffStrKey | 1236 | Nov 5, 1605 |
+---------------+----------------+-------------+
assetid 和 tagid 是来自其他表的外键。想想代表文件的assetid,而tagid/value对是描述符的映射。
现在,API(在 Java 中)将所有这些键值对创建为 Map 对象。这包括时间戳/日期等内容。我们想要做的是能够以某种方式为键值对中的值存储不同类型的数据。或者至少,将其以不同的方式存储在数据库中,这样如果需要,我们可以运行查询检查这些标签上的日期范围等。但是,如果它们作为文本项存储在数据库中,那么我们必须 a.) 知道这实际上是一个日期/时间/时间戳项,并且 b.) 转换为我们可以实际运行的东西上查询。
到目前为止,我只能想到一个想法,而无需完全改变数据库的布局。
就是扩展assettag表(如上图),增加各种类型(数值、文本、时间戳)的列,让它们为空,然后在插入时,检查对应的'key'来确定是什么类型的数据确实如此。但是,我可以看到这种实现存在很多问题。
任何 PostgreSQL-Ninjas 都可以就如何解决这个问题提出建议吗?我最近才回到数据库交互的深层次,所以我承认我有点生疏了。