gpt4 book ai didi

postgresql - 在 postgres 的同一列中存储不同数据类型的明智方法?

转载 作者:行者123 更新时间:2023-11-29 11:16:48 26 4
gpt4 key购买 nike

我目前正在尝试修改与 postgres 数据库交互的现有 API。长话短说,它本质上是存储描述符/元数据以确定实际“ Assets ”(通常是某种文件)在服务器硬盘上的存储位置。

目前,可以使用任意数量的未定义键值对(即 uploadedBy、addedOn、assetType 等)来“标记”这些“ Assets ”。这些标记存储在单独的表中具有类似于以下的结构:

+---------------+----------------+-------------+
|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.) 转换成我们可以实际运行的东西查询。

到目前为止,我只能想到 1 个想法,而无需完全改变数据库的布局。

就是把assettag表(如上图)扩充,多出各种类型(numeric, text, timestamp)的column,允许它们为null,然后insert时,检查对应的'key',找出是什么它确实是一种数据类型。但是,我发现这种实现存在很多问题。

任何 PostgreSQL-Ninjas 都可以就如何解决这个问题提出建议吗?我最近才重新回到数据库交互的深处,所以我承认我有点生疏。

最佳答案

你基本上有两个选择:

选项 1:稀疏表

每种数据类型都有一列,但只使用与您要存储的数据类型相匹配的列。当然,这会导致大多数列为空 - 浪费空间,但纯粹主义者喜欢它,因为它具有强类型。必须检查每一列是否为 null 以确定适用的数据类型有点笨拙。此外,如果您真的想存储一个空值,那就太糟糕了 - 那么您必须选择一个“意味着空值”的特定值 - 更加笨拙。

选项 2:两列 - 一列用于内容,一列用于类型

一切都可以用文本表示,所以有一个文本列用于值,另一列(int 或文本)用于类型,这样您的应用程序代码就可以在正确的类型对象中恢复正确的值。好消息是你没有很多空值,但重要的是你可以轻松地将类型扩展到 SQL 数据类型之外的东西,通过将它们的值存储为 json 并将它们的类型存储为类名来扩展到应用程序类。

在我的职业生涯中,我曾多次使用选项 2,它总是非常成功。

关于postgresql - 在 postgres 的同一列中存储不同数据类型的明智方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18233570/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com