PostgreSQL中外键REFERENCE是否会完整复制字符串值?
PostgreSQL字符串存储:引用还是完整复制?
PostgreSQL默认会完整存储字符串值,不会像部分编程语言那样自动用指针引用重复的字符串——每个行里的TEXT字段都会独立存放完整的字符串内容,哪怕多个行的字符串完全相同。
针对你提到的128字节user_id作为主键的场景,明确结论和方案如下:
- 如果你直接用
user_id TEXT做主键并在其他表中作为外键引用,每个外键字段都会完整存储这128字节的字符串,不存在自动共享引用的机制。 - 你考虑的
bridge_id INT代理主键方案非常合理:- 可以建立单独的映射表,示例代码:
CREATE TABLE user_mapping ( bridge_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, user_id TEXT UNIQUE NOT NULL ); - 其他业务表仅用
bridge_id INT作为外键关联,这样user_id只在映射表中存储一次,其他表仅存占用空间极小的INT值,既节省存储资源,也能提升关联查询的效率。
- 可以建立单独的映射表,示例代码:
另外补充:PostgreSQL本身没有内置的字符串自动驻留(类似Java字符串池)特性,除非你手动通过代理键、自定义逻辑实现字符串共享存储,否则重复的字符串都会被独立存储。
内容的提问来源于stack exchange,提问作者jamie yello
相关产品推荐
相关产品推荐

