我试图在postgresql中使用分区表和Django安装。
从Google主题中我发现,Django本身并不支持分区,所以我自己对表进行了分区。我基于第二个字段对我的表进行分区,该字段是另一个表上的外键。基本模型设置如下:
class Event(models.Model):
id = models.AutoField(primary_key=True)
device = models.ForeignKey("Device")
... (More Fields)
我已经通过device_id对表进行了分区,生成了event_1,event_2等子表。 我的所有查询都包含设备ID,因此查询现在要快得多,但是对于插入,django会生成一个UPDATE语句,如:
UPDATE event SET device=X, ...=X, ... WHERE id=XXX
这会导致数据库遍历表的所有分区以查找指定的ID。由于device_id永远不会改变,我现在想将device_id = XXX语句添加到UPDATE语句的WHERE部分,这将允许数据库仅遍历一个分区。
我认为我的问题只是问题的结果,我在数据库的主键中没有分区键,但是因为django只支持一个字段作为PK而分区键不是唯一的,我不能用它作为PK。
我可以想到两个解决问题的方法:
我认为最优雅的方式是将device_id包含在主键中。因此,不需要对Django进行任何更改,并且仅在Django透明的数据库中进行分区。但是我不确定是否可以在数据库中创建这样的主键。
感谢您的帮助
答案 0 :(得分:1)
我同意你最好离开Django。虽然我从未做过这样的事情,但我认为只需创建一个before insert触发器来构造新的连接主键就很容易了。像这样:
CREATE TABLE foo(
id TEXT NOT NULL,
device_id INT NOT NULL,
CONSTRAINT foo_pkey PRIMARY KEY (id)
);
CREATE SEQUENCE foo_id_seq
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807
START 1
CACHE 1;
CREATE OR REPLACE FUNCTION generate_foo_id()
RETURNS trigger AS
$BODY$
BEGIN
NEW.id := NEW.device_id || '_' || nextval('foo_id_seq');
RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
CREATE TRIGGER trigger_generate_foo_id
BEFORE INSERT
ON foo
FOR EACH ROW
EXECUTE PROCEDURE generate_foo_id();
你是对的,你的分区功能必须拆分它。我从来没有创建过这样做的分区函数,但我不知道为什么它不起作用。但是,您应该使用结果测试并添加对此“答案”的评论(以便将来的用户从测试中受益)。