【发布时间】:2014-05-21 10:48:52
【问题描述】:
我在 PostgreSQL 中有一个名为“状态”的列。首先它曾经是integer 类型的“status_id”。这些值保存在客户端上,因此服务器上有一个名为 statuses 的 no 表,我将在其中保留这些状态,然后对第一个表执行 inner join。
我过去常常从客户端发送状态 ID(它们在客户端上有名称)。但是,在某些时候我明白我最好让服务器保持这些状态。不是在单独的表中,而是在第一个表中,我想让它们成为字符串。所以初始表将有一个字符串类型的status 列(更具体地说,varchar)。我读它不会那么慢。
总的来说,这是个好主意吗?我想这是因为每次都做inner join(以防我将状态保存在单独的表中)以及从客户端发送ID都很昂贵。
1) 我唯一担心的是status 列的类型应该是char,而不是varchar。我想它应该使它更有效。是这样吗?
2) 如果第一种情况是正确的,那么我不确定我能否使用完全相同数量的字符(例如 5 个字符)来命名所有状态。其中一些可能更长,一些更短。我该如何解决这个问题?
更新:
这不是取消国有化,因为我说的是 1 个单桌。没有也从来没有第二个名为 Statuses 的表,其中包含字段 (id, status_name)。
我想表达的是我可以使用 char(n) 作为 status_name 并在其上添加索引。那么它应该足够快。但是,用特定 (n) 个字符来命名所有状态可能是可能的,也可能是不可能的,这是唯一的问题。
【问题讨论】:
-
您描述的过程是状态列的非规范化。这将导致它自己的问题。您确定不想保留“状态”表吗?在像这样的低基数表上,连接相对便宜。
-
@RobertHarvey 这不是非规范化。如果我有 2 个表并且仍然使用第一个表中的“状态”列,那将是非规范化。
-
那为什么它被存储为
status_id类型的integer? -
@RobertHarvey,因为它是一个整数。如果愿意,字符串表示形式会以枚举(Int、String)或 Map 的形式存储在客户端上。
-
正确的做法是在数据库中创建一个状态表,以 status_id 作为主键。但是,不管你的船是什么。
标签: performance postgresql types normalization postgresql-9.2