运行Postgres 7.4(是的,我们正在升级)
我需要将1到100个选定项目存储到数据库中的一个字段中。 98%的时间只输入1个项目,2%的时间(如果有的话)会有多个项目。
这些项目只不过是文字描述(截至目前),不超过30个字符。它们是用户选择的静态值。
想知道用于存储所需数据的最佳列数据类型。我在想BLOB,但不知道这是不是太过分了。也许是JSON?
我也考虑过ENUM但是到目前为止我不能真正做到这一点,因为我们正在运行Postgres 7.4
我还希望能够轻松识别输入的项目,因此没有映射或引用表格。
答案 0 :(得分:40)
这里有几个问题,所以我将分别解决这些问题:
我的一般规则是:不要。除了之外,所有这些都需要第二个表(或第三个)与外键。当然,现在看起来似乎更容易了,但如果用例出现在您需要单独查询这些项目的情况下呢?这也意味着您有更多的懒惰实例化选项,并且您可以跨多个框架/语言获得更一致的体验。此外,您不太可能遇到连接超时问题(30,000个字符很多)。
您提到您正在考虑使用ENUM。这些值是固定的吗?你提前知道吗?如果是这样,这将是我的结构:
基础表(你现在拥有的):
| id primary_key sequence
| -- other columns here.
项目表:
| id primary_key sequence
| descript VARCHAR(30) UNIQUE
地图表:
| base_id bigint
| items_id bigint
映射表将具有外键,因此base_id映射到Base表,而items_id将映射到items表。
如果您想要一种简单的方法从数据库中检索它,那么创建一个执行连接的视图。您甚至可以创建插入和更新规则,以便您实际上只处理一个表。
如果你必须做这样的事情,为什么不只是使用字符描绘的字符串?它比CSV,XML或JSON需要更少的处理能力,而且会更短。
就个人而言,我会使用TEXT
。如果你使用某种形式的IDE,根据我的经验,这听起来好像你获得了很多,而BLOB
更容易阅读。
答案 1 :(得分:6)
嗯,最近的Postgres版本中有array type(不是100%关于PG 7.4)。您甚至可以使用GIN或GIST索引对它们进行索引。语法是:
create table foo (
bar int[] default '{}'
);
select * from foo where bar && array[1] -- equivalent to bar && '{1}'::int[]
create index on foo using gin (bar); -- allows to use an index in the above query
但正如之前的回答所暗示的那样,正确地进行正常化会更好。