我有一张如下表:
create table my_table (
id int8 not null,
id_A int8 not null,
id_B int8 not null,
id_C int8 null,
constraint pk_my_table primary key (id),
constraint u_constrainte unique (id_A, id_B, id_C)
);
Run Code Online (Sandbox Code Playgroud)
我想(id_A, id_B, id_C)
在任何情况下都与众不同。所以下面的两个插入肯定会导致错误:
INSERT INTO my_table VALUES (1, 1, 2, NULL);
INSERT INTO my_table VALUES (2, 1, 2, NULL);
Run Code Online (Sandbox Code Playgroud)
但它没有按预期运行,因为根据文档,两个NULL
值不会相互比较,因此两个插入都没有错误地通过。
我怎么能保证我的唯一约束,即使id_C
可以NULL
在这种情况下?实际上,真正的问题是:我可以在“纯 sql”中保证这种唯一性,还是必须在更高级别(在我的情况下为 java)来实现它?
我有一个旧模式(免责声明!),它使用基于哈希生成的 id 作为所有表的主键(有很多)。这种 id 的一个例子是:
922475bb-ad93-43ee-9487-d2671b886479
Run Code Online (Sandbox Code Playgroud)
改变这种方法是不可能的,但是索引访问的性能很差。撇开这可能的无数原因不谈,我注意到有一件事似乎不太理想 - 尽管所有许多表中的所有 id 值的长度都正好是 36 个字符,但列类型是varchar(36)
,而不是 char(36)
。
将列类型更改为固定长度是否会char(36)
提供任何显着的索引性能优势,除了每个索引页的条目数量增加很小等之外?
即在处理固定长度类型时 postgres 的执行速度是否比处理可变长度类型快得多?
请不要提及微小的存储节省 - 与对列进行更改所需的手术相比,这无关紧要。
我正在创建一个表来存储有关对象在网格(游戏地图)中的位置的信息。
例如,我有一个 10x10 的网格,我想在数据库中存储单元格 (5,5) 有一个蓝色框,(3,3) 有一把红色椅子等等。
任何一个方格中可以有多个项目,但同一个项目不应该在同一个方格中出现两次。
这种结构可以接受吗?(主键中的所有列)
(room_id (FK), room_object_id (FK), x_cell, y_cell)(PK)
Run Code Online (Sandbox Code Playgroud)
还是有这个会更好
id(PK), room_id (FK), room_object_id (FK), x_cell, y_cell
Run Code Online (Sandbox Code Playgroud)
我认为第一种方法更有意义,但我担心在输入内容时增加完整性检查可能会产生大量不必要的开销。
postgresql ×2
constraint ×1
index ×1
null ×1
performance ×1
primary-key ×1
schema ×1
varchar ×1