我有一个 Postgresql 11 数据库。假设我有一张桌子,叫做houses。它应该有数十万条记录。
CREATE TABLE houses (
pkid serial primary key,
address varchar(255) NOT NULL,
rent float NOT NULL
);
Run Code Online (Sandbox Code Playgroud)
现在,我的房子有我想在数据库中注册的功能。由于可能的功能列表会很长(几十个)并且会随着时间的推移而演变,因为我不想在表屋中添加一长串列并使用“ALTER TABLE”不断更改表,我想到了这些功能有一个单独的表格:
CREATE TABLE house_features (
pkid serial primary key,
house_pkid integer NOT NULL,
feature_name varchar(255) NOT NULL,
feature_value varchar(255)
);
CREATE INDEX ON house_features (feature_name, feature_value);
ALTER TABLE house_features ADD CONSTRAINT features_fk FOREIGN KEY (house_pkid) REFERENCES houses (pkid) ON DELETE CASCADE;
Run Code Online (Sandbox Code Playgroud)
平均而言,每个房屋记录在house_features表中将有 10-20 条记录。
到目前为止,这似乎是一个简单高效的模型:我可以添加尽可能多的不同功能,控制上层(应用层和/或 GUI)中feature_name和feature_value的可能值。每次应用程序发展时我都不必更改数据库,我需要一种新的功能。 …
我有一个 PostgreSQL 10 脚本,我想在开始时为其声明一次变量,然后在整个脚本中使用它们(带有可能的事务)。
我知道我可以做到:
DO $$
DECLARE test float := 0.1 ;
BEGIN
< do whatever here>
END $$
Run Code Online (Sandbox Code Playgroud)
但这使我每次有 BEGIN / END 块时都声明变量。