0

this question과 비슷하지만 그 중 아무 것도 이상적이지 않습니다.데이터베이스 테이블의 정렬 순서 열을 사용하는 대신

class Parent(models.Model): 
    id = models.AutoField(primary_key=True) 

class Child(models.Model): 
    id = models.AutoField(primary_key=True) 
    parent = models.ForeignKey(Parent) 

SQL에서 (내가 바로이 코드를 가지고 희망) :

CREATE TABLE parent (
    id integer PRIMARY KEY 
); 

CREATE TABLE child (
    id integer PRIMARY KEY 
    parent_id integer REFERENCES parent 
); 

Child 객체가 특정에 속하는 그래서 할 수있는 방법

PostgreSQL의 사용이 장고 모델을 고려 Parent은 재정렬 할 수 있습니까? 드래그 드롭 UI를 사용하여 사용자는 Child을 드래그하여 업데이트 된 순서를 저장할 수 있습니다. Child을 생성, 업데이트 및 삭제하는 작업은 한 번만 수행하면됩니다. 즉, Parent에서 무언가를 업데이트하지 않아도됩니다. 각 아이디어는 좋지 않은 이유

나는 이유를 몇 가지 불완전한 아이디어를 가지고 : 정렬

  1. 순으로 사용자가 제공하는 VARCHAR와 Child - 이것은 특정 문자로 시작하는 이름을 생각하는 사용자를 강제로 정당한 사유가 없더라도 스트레스가 많은 창의력이 요구됩니다. Parent에서

  2. , Child 객체의 기본 키에 대응하는 정수 배열을 스토어 - 생성 및 삭제를위한 하나 개 이상의 연산을 필요 Parent의 배열마다 갱신 될 필요가있을 것이다. 데이터 무결성을 보장하는 데이터베이스가 없습니다.

  3. 정수 열로 정렬 Child을 만들 때 추가 읽기가 필요하므로 사용할 다음 정수를 찾으십시오. 또 다른 문제는 (생산 과정에서 발생할 가능성이 거의 없음에도 불구하고) 정수 사이의 간격이 없어지면 삽입 된 객체의 "뒤에"있는 객체를 밀어 넣어야한다는 것입니다. 이 상황은 반복적으로 마지막 개체를 가져 와서 처음부터 처리함으로써 인위적으로 강제 될 수 있습니다.

  4. Child에서 다음/이전 Child을 참조하는 정수 ID를 저장합니다. - 이것은 3의 해킹 문제를 해결하지만, 불합리하게 비효율적이며 병참 문제로 보입니다. (부가 가입 포함 또는 jsonb와 두 번째 테이블을 교체하지 않음)이 요구 사항에 대한 웅변 솔루션은

이 있습니까?

+1

3을 사용하십시오. 설명하는 문제는 실제로 발생하지만 부모 당 실제로 많은 수의 자녀가없는 한 중요하지는 않습니다. –

답변

0

정렬 순서 열로 float를 사용하는 방법은 어떻습니까? 아이템 사이에 삽입/이동할 때, sortorder를 (previus-item.sortorter + next-item.sortorder)/2로 설정하십시오. 이것은 무한대로 실행되지는 않지만, 시스템에 따라 실제 월드 문제를 일으키지 않아야합니다. 또한 야간에 자녀의 정렬 순서에있는 간격을 다시 설정하는 서비스 작업을 할 수도 있습니다.

+0

밤새도록 서비스 작업을 원하지 않는다면, 결과적으로 플로트는 정밀도가 떨어지며 자동으로 주문을 유지하지 못합니다. 정수와 같은 문제이지만 부동 소수점은 사용하기가 더 쉽지만 "간격이 부족할 때"정확히 모호합니다. – dtgq