バックグラウンド
PostgreSQL 9.0 データベースには、多対多の関係を持つさまざまなテーブルがあります。これらの関係の数は制限する必要があります。いくつかのテーブルの例を次に示します。
CREATE TABLE authentication (
id bigserial NOT NULL, -- Primary key
cookie character varying(64) NOT NULL, -- Authenticates the user with a cookie
ip_address character varying(40) NOT NULL -- Device IP address (IPv6-friendly)
)
CREATE TABLE tag_comment (
id bigserial NOT NULL, -- Primary key
comment_id bigint, -- Foreign key to the comment table
tag_name_id bigint -- Foreign key to the tag name table
)
ただし、関係が異なれば、制限も異なります。たとえば、authentication
表では、ip_address
1024 個のcookie
値が許可されています。一方、tag_comment
テーブルでは、それぞれcomment_id
に 10 個の を関連付けることができますtag_name_id
。
問題
現在、多くの関数にこれらの制限がハードコーディングされています。データベース全体に制限を分散させ、動的に変更されないようにします。
質問
一般的な方法でテーブルに最大の多対多の関係制限を課すにはどうすればよいでしょうか?
考え
制限を追跡するテーブルを作成します。
CREATE TABLE imposed_maximums (
id serial NOT NULL,
table_name character varying(128) NOT NULL,
column_group character varying(128) NOT NULL,
column_count character varying(128) NOT NULL,
max_size INTEGER
)
制限を確立します。
INSERT INTO imposed_maximums
(table_name, column_group, column_count, max_size) VALUES
('authentication', 'ip_address', 'cookie', 1024);
INSERT INTO imposed_maximums
(table_name, column_group, column_count, max_size) VALUES
('tag_comment', 'comment_id', 'tag_id', 10);
トリガー関数を作成します。
CREATE OR REPLACE FUNCTION impose_maximum()
RETURNS trigger AS
$BODY$
BEGIN
-- Join this up with imposed_maximums somehow?
select
count(1)
from
-- the table name
where
-- the group column = NEW value to INSERT;
RETURN NEW;
END;
トリガーをすべてのテーブルにアタッチします。
CREATE TRIGGER trigger_authentication_impose_maximum
BEFORE INSERT
ON authentication
FOR EACH ROW
EXECUTE PROCEDURE impose_maximum();
明らかに、書かれているようには機能しません...それを機能させる方法、または次のような制限を適用する方法はありますか:
- 単一の場所で; と
- ハードコーディングされていませんか?
ありがとうございました!