背景
在 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
的 s。
问题
目前,许多函数都对这些限制进行了硬编码;分散整个数据库的限制,并防止它们被动态更改。
问题
您将如何以通用方式对表施加最大多对多关系限制?
主意
创建一个表来跟踪限制:
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();
显然它不会像书面那样工作......有没有办法让它工作,或者以其他方式强制执行限制,例如:
- 在一个位置;和
- 没有硬编码?
谢谢!