Problema
Existe uma maneira de contar automaticamente as tabelas relacionadas (um para muitos), onde a contagem aumentará / diminuirá automaticamente dependendo se adicionarmos ou removermos um item relacionado.
Então, obviamente, eu poderia apenas fazer um COUNT, mas por motivos de desempenho, custa milhões de registros e são consultas muitas e muitas vezes. Como solução, em vez de contar todas as vezes, eu realmente criaria um contador onde adicionar 1 ao adicionar um novo item relacionado ou remover 1 ao excluir ou deferir outro item
Para fazer isso, posso apenas criar outra tabela que sirva como contador e consultar essa tabela sem contar.
Existe uma maneira melhor, de preferência, que seja automática?
Exemplo
esquema
create table object
(
object_id int auto_increment primary key,
name varchar(120) not null
);
create table item
(
item_id varchar(63) not null,
object_id int not null,
primary key (object_id, item_id)
);
insert into object (name) VALUES ("hello");
insert into item (item_id, object_id) VALUES
("item1", 1),
("item2", 1),
("item3", 1),
("item4", 1);
O objeto "hello" possui 4 itens:
select count(*) from item where object_id = 1;
-- ouput: 4
No entanto, descobri que, como solução alternativa, posso criar um contador ( que está usando Python de back-end ) que cada vez que você faz uma operação CRUD , o contador é atualizado. Por exemplo:
Esquema de contador
create table item_counter
(
counter bigint NOT NULL DEFAULT 0,
object_id int NOT NULL primary key
)
Então agora o ORM no poderia faríamos algo assim (novamente, será manipulado em Python, mas não importa é apenas como exemplo:
-- create object AND item_counter
insert into object (name) VALUES ("hello");
-- create in the same time a counter
insert into item_counter (object_id) VALUES ((SELECT object_id FROM object where name = "hello"));
-- create items
insert into item (item_id, object_id) VALUES ("item1", 2);
update item_counter set counter = counter + 1 where object_id = 2;
insert into item (item_id, object_id) VALUES ("item2", 2);
update item_counter set counter = counter + 1 where object_id = 2;
insert into item (item_id, object_id) VALUES ("item3", 2);
update item_counter set counter = counter + 1 where object_id = 2;
insert into item (item_id, object_id) VALUES ("item4", 2);
update item_counter set counter = counter + 1 where object_id = 2;
-- select the counter instead
select counter from item_counter where object_id = 2;
Que se fosse em python ficaria assim
# pseudo ORM code
class ItemORM:
def save(self, item_id, object_id):
self.orm.save(item_id, object_id)
counter = self.orm.get_counter(object_id)
counter.add()
Então, existe uma maneira melhor, especialmente, algo que o MySQL possa fazer automaticamente?
Mais Contexto
Caso você queira saber por quê, digamos que estou trabalhando em uma grande base de código, com muitos códigos legados e dependências de API usados por clientes externos e atualmente não há uma contra-implementação , mas é apenas uma ideia minha para superá-la. Portanto, alterar grande parte do código é muito arriscado; em vez disso, ajustar as tabelas MYSQL pode ser uma solução melhor.
A tarefa pode ser facilmente resolvida com gatilho(s).
Por exemplo, se INSERT for a única ação na
item
tabela, somente o gatilho AFTER INSERT será necessário:DEMO com conjunto completo de gatilhos .