0

比方說,我有如下表複合鍵與用戶提供的字符串列,外鍵

TABLE subgroups (
    group_id  t_group_id NOT NULL REFERENCES groups(group_id), 
    subgroup_name t_subgroup_name NOT NULL, 
    more attributes ... 
) 
  • subgroup_name是唯一的一個​​。
  • A group可以有很多subgroups
  • subgroup_names是用戶提供的。 (我想避免使用subgroup_id列,subgroup_name在模型中有意義,不僅僅是一個標籤,我提供了預定名稱的列表,但允許用戶添加他的所有者以獲得靈活性)。
  • 此表具有2級引用包含子組屬性(包含多對一關係)的子表;


我想有一個PRIMARY KEY(GROUP_ID,上部(修剪(subgroup_name)));

據我所知,postgres不允許在函數上使用PRIMARY KEY/UNIQUE。 IIRC,關係模型也要求使用列作爲存儲。

CREATE UNIQUE INDEX ON subgroups (group_id, upper(trim(subgroup_name)));不能解決我的問題 因爲我模型中的其他表將有指向這兩列的FOREIGN KEY。


我看到兩個選項。

選項A)

  • 存放在subgroup_name
  • 一個清理分組名稱添加,將包含未清潔的字符串

選項B)

    一個額外的列稱爲subgroup_name_raw
  • 在我的密鑰對上創建一個UNIQUE INDEX和PRIMARY KEY。 (看起來像是一個巨大的浪費)

任何見解?

注:我使用的是Postgres 9.2

+0

爲什麼要存儲未清理的subgroup_name版本?我試圖弄清楚你的想法。當然,你有乾淨的版本的組+子組ID和一個查找表給出顯示名稱。 –

+0

我想讓未清理的版本顯示在用戶界面中。我不想顯示uppercased版本,我想確保名稱不區分大小寫。 子組將有成員,消息和其他對象附加到它。包含這些對象的表將具有子組表的外鍵。我看到一個乾淨的subgroup_name等同於subgroup_id。 – akp

+1

因此,如果是用戶顯示,您仍然希望將其放入查找表中。他們大概會想在某個時候改變顯示名稱。他們總是這樣做。 –

回答

0

其實你可以做一個函數的輸出的唯一約束。你不能在表格定義中做到這一點。你需要做的是創建一個唯一的索引。因此,像:

CREATE UNIQUE INDEX subgroups_ukey2 ON subgroups(group_id, upper(trim(subgroup_name))); 

PostgreSQL有一些絕對驚人的索引功能,並在功能輸出創造獨特的(和部分唯一的)指標的能力是相當低估。