次のテーブルがあるとしましょう
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 に対して UNIQUEgroup(group_id)
です。- A
group
は多くの を持つことができますsubgroups
。 - これら
subgroup_names
はユーザー提供です。subgroup_id
(列の使用は避けたいと思います。subgroup_name
モデルでは意味があり、単なるラベルではありません。あらかじめ決められた名前のリストを提供していますが、ユーザーは柔軟性のために自分の名前を追加できます)。 - このテーブルには、サブグループ属性 (多対 1 の関係) を含む子テーブルを参照する 2 つのレベルがあります。
(group_id, upper(trim(subgroup_name))); に PRIMARY KEY を設定したいと思います。
私が知っていることから、postgres は関数で PRIMARY KEY/UNIQUE を使用することを許可していません。IIRC、リレーショナル モデルでは、列を保存されたものとして使用することも必要です。
CREATE UNIQUE INDEX ON subgroups (group_id, upper(trim(subgroup_name)));
私のモデルの他のテーブルには、これらの2つの列を指すFOREIGN KEYがあるため、私の問題は解決しません。
2 つの選択肢があります。
オプション A)
- クリーンアップされたサブグループ名を subgroup_name に保存します
- クリーンアップされていない文字列を含む subgroup_name_raw という列を追加します
オプション B)
- キー ペアに UNIQUE INDEX と PRIMARY KEY の両方を作成します。(かなりの無駄のようです)
洞察はありますか?
注:Postgres 9.2を使用しています