listas ordenadas em django

votos
12

Eu tenho problema muito simples. Eu preciso criar modelo, que representam elemento da lista ordenada. Este modelo pode ser implementado como este:

class Item(models.Model):
    data = models.TextField()
    order = models.IntegerField()

ou assim:

class Item(models.Model):
    data = models.TextField()
    next = models.ForeignKey('self')

O caminho é o preferido? O que desvantagens que cada solução?

Publicado 09/01/2009 em 15:06
fonte usuário
Em outras línguas...                            


3 respostas

votos
20

Essencialmente, a segunda solução que propomos é uma lista ligada. Lista ligada implementado no nível de banco de dados geralmente não são uma boa idéia. Para recuperar uma lista de nelementos, você terá nacesso ao banco (ou use consultas complicadas). Em termos de desempenho, recuperação de uma lista em O (n), não é muito eficiente.

No código regular, lista ligada são usados ​​para obter um melhor desempenho de inserção em comparação com matrizes (não há necessidade de mover todos os elementos ao redor). Em seu banco de dados, atualizar todos os elementos não é tão complicado em apenas 2 consultas:

UPDATE item.order = item.order + 1 FROM item WHERE order > 3
INSERT IGNORE  INTO item (order, ...) VALUES (3, ...)

Eu lembro de ter visto um aplicativo reutilizáveis ​​que implementou tudo isso e uma interface de administração agradável, mas eu não posso encontrá-lo agora ...

Para resumir, definitivamente usar a solução # 1 e ficar longe de solução nº 2, a menos que você tem uma muito boa razão para não!

Respondeu 09/01/2009 em 15:17
fonte usuário

votos
6

Isso depende do que você quer fazer.

O primeiro parece melhor fazer uma única consulta no banco de dados e obter todos os dados na ordem correta

A segunda parece melhor para inserir um elemento entre dois elementos existentes (porque no primeiro você teria que mudar um monte de itens, se os números são sequenciais)

Eu usaria o primeiro, porque ele parece se encaixar melhor uma tabela de banco de dados, que é como o Django armazena dados modelo atrás do capô.

Respondeu 09/01/2009 em 15:12
fonte usuário

votos
-6

Não há outra solução.

class Item(models.Model):
    data = models.TextField()

Você pode apenas picles ou lista de marechal Python no campo de dados ea carga-lo. Este é bom para atualização e leitura, mas não para pesquisar por exemplo ir buscar todas as listas que contêm um item específico.

Respondeu 09/01/2009 em 16:22
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more