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 に対して UNIQUEgroup(group_id)です。
  • Agroupは多くの を持つことができます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を使用しています

4

1 に答える 1

0

実際には、関数の出力に対して UNIQUE 制約を実行できます。ただし、テーブル定義ではできません。あなたがする必要があるのは、後で一意のインデックスを作成することです。次のようなものです:

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

PostgreSQL には非常に優れたインデックス作成機能が多数ありますが、関数の出力に対して一意の (および部分的に一意の) インデックスを作成する機能は、かなり過小評価されています。

于 2013-11-01T16:05:12.643 に答える