简体   繁体   English

外键与分区

[英]Foreign keys vs partitioning

Since foreign keys are not supported by partitioned mySQL databases for the moment, I would like to hear some pro's and con's for a read-heavy application that will handle around 1-400 000 rows per table. 由于目前分区的mySQL数据库不支持外键,我想听一些读取繁重的应用程序的专业版和内容,每个表将处理大约1-400 000行。 Unfortunately, I dont have enough experience yet in this area to make the conclusion by myself... 不幸的是,我在这方面还没有足够的经验来自己做出结论......

Thanks a lot! 非常感谢!

References: 参考文献:

How to handle foreign key while partitioning 如何在分区时处理外键

Partitioning mySQL tables that has foreign keys? 分区具有外键的mySQL表?

Well, if you need partitioning for a table as small as 400.000 rows get another database than MySQL. 好吧,如果你需要为一个只有400.000行的表进行分区,那么获取另一个数据库而不是MySQL。 Seriously. 认真。 By modern standards any table below 1.000.000 rows is normally neglegible in size (not even small), unless you also dont have any index etc. And modern standards are about 10 years old in this regard. 根据现代标准,任何低于1.000.000行的表通常都是可以忽略不计的(甚至不是很小),除非你也没有任何索引等等。现代标准在这方面大约有10年的历史。

Well, partition is not a good solution for complicate data model. 那么,分区对于复杂的数据模型来说不是一个好的解决方案。 If you only have 2 to 3 tables depending on each other, you may be able to do it but it is not pretty. 如果您只有2到3个表彼此依赖,您可能可以这样做,但它不漂亮。 Each table must have an column that determine the partition. 每个表必须有一个确定分区的列。 Then, each table must have a trigger to create the new table, set the foreign key and unique constraint. 然后,每个表必须有一个触发器来创建新表,设置外键和唯一约束。

For example, audittransaction<- auditentry 例如,audittransaction < - auditentry

Each audittransactionhas 0 to n auditentry. 每个audittransaction都有0到n auditentry。 table auditentry contains the foreign key of transaction. table auditentry包含事务的外键。 Both table have to have column creationDate since it is used for partition both tables. 两个表都必须具有列creationDate,因为它用于分区两个表。

------ create a trigger to insert audittransaction within the trigger ------创建一个触发器,在触发器中插入audittransaction

create or replace function audittransaction_insert_function() 
returns trigger as $$ 
DECLARE

    tablepartition varchar;
    tablename varchar;
    startbounds timestamp;
    endbounds timestamp;                


BEGIN
    tablepartition :=  to_char(date_trunc('month', NEW.whendone), 'YYYYMMDD');  
    tablename := 'audittransaction_' || tablepartition ;        

    if not exists(select * from information_schema.tables where table_name = tablename) then
        startbounds := date_trunc('month', NEW.whendone);
        endbounds := startbounds + cast('1 months' as interval);
        execute 'create table ' || tablename || ' ( CHECK (whendone >= ' || quote_literal(startbounds) || ' and whendone < ' || quote_literal(endbounds)|| ') ) inherits (audittransaction)';
        execute 'ALTER TABLE '||  tablename ||' ADD CONSTRAINT '||tablename||'_unique_id UNIQUE (id)';          
    end if;     
    execute 'insert into ' || tablename || ' (id, operationid, whendone, "comment", ticketid ,transactionid, userid )  values (' || quote_literal(NEW.id) || ',' || quote_literal(NEW.operationid) || ',' || quote_literal(NEW.whendone) || ')';                
    return null; 
END; $$ 
LANGUAGE plpgsql;

create trigger insert_audittrans

----- then, create a trigger for autientry -----然后,为autientry创建一个触发器

create or replace function auditentry_insert_function() 
returns trigger as $$ 
DECLARE
    tablepartition varchar;
    tablename varchar;
    startbounds timestamp;
    endbounds timestamp;                


BEGIN
    tablepartition :=  to_char(date_trunc('month', NEW.transactiontimestampgmt), 'YYYYMMDD');   
    tablename := 'auditentry_' || tablepartition ;

    if not exists(select * from information_schema.tables where table_name = tablename) then
        startbounds := date_trunc('month', NEW.transactiontimestampgmt);
        endbounds := startbounds + cast('1 months' as interval);
        execute 'create table ' || tablename || ' ( CHECK (transactiontimestampgmt >= ' || quote_literal(startbounds) || ' and transactiontimestampgmt < ' || quote_literal(endbounds)|| ') ) inherits (auditentry)';
        execute 'ALTER TABLE '||  tablename ||' ADD CONSTRAINT '||tablename||'_unique_id UNIQUE (id)';  
        execute 'ALTER TABLE ' || tablename ||' ADD CONSTRAINT auditentry FOREIGN KEY (audit_transaction_id) REFERENCES audittransaction_'||tablepartition ||'(id)';                
    end if;     
    execute 'insert into ' || tablename || ' (id, audit_transaction_id, eventid, transactiontimestampgmt,timestampgmt, acknowledged, resolved, acknowledgedbyusername, acknowledgeddate,  notificationlevel, resolvedbyusername, resolveddate, severity,  parentauditentry_id )  values (' || quote_literal(NEW.id) || ',' || quote_literal(NEW.audit_transaction_id) || ',' || quote_literal(NEW.eventid) || ','||quote_literal(NEW.transactiontimestampgmt)||')';             
    return null; 
END; $$ 
LANGUAGE plpgsql;

create trigger insert_auditentry before insert on auditentry for each row execute procedure auditentry_insert_function();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM