Что рекомендуемое, чтобы считать Фореигн Кеи в модели, у которой есть таблица больше 14mil, реестры?

У меня есть таблица болезней, у которой есть только 3 колонны:

  • Автоматический id.
  • Код varchar(10).
  • Имя string.

Но, у него есть 14197 реестров.

Проблема состоит в том, что Ваш первичный ключ (Примари Кеи) - чужеземный ключ для других моделей, но опаздывает в том, чтобы загружать ее много.

Использование django и PostgreSql, что самое рекомендуемое для того, чтобы не был отсрочен так груз этой Foreign Key в template?

template

модели

class Cie10(models.Model):
    codigo = models.CharField(max_length=10)
    nombre = models.TextField()
    def __unicode__(self):
        return (u"%s (%s)"%(self.nombre, self.codigo)).strip() or "-"

class EnfermedadGeneral(Enfermedad):
    dias = models.IntegerField(validators=[no_negativo])
    cie10 = models.ForeignKey(Cie10, verbose_name="diagnóstico Cie10")
    soportes = models.FileField(upload_to=crear_ruta_archivo_enfermedad_general, blank=True, null=True)

class Enfermedad(models.Model):
    persona = models.ForeignKey(Persona, related_name="enfermo")
    responsable = models.ForeignKey(Persona, related_name="responsable")
    municipio = models.ForeignKey(Municipio)
    zona = models.IntegerField(choices=ZONAS)
    sucursal = models.ForeignKey(Sucursal)
    area = models.ForeignKey(Area)
    cargo = models.ForeignKey(Cargo)
    tipo_empleado = models.CharField(max_length=1, choices=TIPO_EMPLEADO)
    fecha_ingreso = models.DateField()
    fecha_diligenciamiento = models.DateTimeField(auto_now_add=True, blank=True)

    fecha = models.DateField(verbose_name="fecha del diagnóstico")

    def __unicode__(self):
        return (u"%s (%s)"%(self.persona, self.fecha)).strip() or "-"

    class Meta:
        unique_together = (("persona", "fecha"),)

Пример Form

class EnfermedadGeneralForm(forms.ModelForm):
    class Meta: model = EnfermedadGeneral
    exclude = ('responsable', 'persona', 'sucursal', 'area', 'cargo', 'tipo_empleado', 'fecha_ingreso', 'fecha_diligenciamiento',)
    widgets = {
        'fecha' : MyDateWidget(),
        'municipio': Select2Widget(),
        'cie10': Select2Widget(),
        'soportes' : MyFileInput(), } 

Формуляр в сдержись

{% csrf_token %} {% bootstrap_form form layout="horizontal" %}

Пример вида

@login_required
@all_permission_required('novedades.add_enfermedadgeneral')
def crear_enfermedad_general(request, idPersona=None):
    persona = None
    hoy = datetime.now()
    usuario = Persona.objects.get(usuario=request.user)

    enfermedadGeneralCreada = request.session.get('nueva_enfermedad_general')

    if enfermedadGeneralCreada == True:
        del request.session['nueva_enfermedad_general']

    if idPersona:
        try:
            persona = Persona.objects.get(id=idPersona)
        except Exception:
            return redirect('crear_enfermedad_general')


    if request.method == 'POST':
        form = EnfermedadGeneralForm(request.POST, request.FILES)
        if form.is_valid():
            objeto = form.save(commit=False)
            objeto.responsable = Persona.objects.get(usuario=request.user)
            objeto.persona = persona
            objeto.sucursal = persona.sucursal
            objeto.area = persona.cargo.area
            objeto.cargo = persona.cargo
            objeto.tipo_empleado = persona.tipo_empleado
            objeto.fecha_ingreso = persona.fecha_ingreso

            objeto.soportes = None
            objeto.save()

            try:
                objeto.soportes = request.FILES['soportes']
            except Exception:
                1

            objeto.save()

            request.session['nueva_enfermedad_general'] = True
            return redirect('crear_enfermedad_general')

        form2 = CedulaForm(request.POST)
        if form2.is_valid():
            persona = form2.cleaned_data['persona']
            return redirect('crear_enfermedad_general', persona.id)
    else:
        form = EnfermedadGeneralForm()
        try:
            form2 = CedulaForm({'persona': persona.id})
        except Exception:
            form2 = CedulaForm()

    return render(request, 'enfermedad_general.html', {
        'enfermedadGeneralCreada': enfermedadGeneralCreada,
        'persona': persona,
        'form': form,
        'form2': form2,
        'hoy': hoy,
        'usuario': usuario,
    })

14
задан 25.04.2017, 07:11
3 ответа

Я не 100 % безопасных, потому что widget Select2Widget я это не знаю, но если он этот, ты загружаешь 14 тысяч реестров в renderizado.

Может быть, ты был бы должен менять widget для тебя я взял один, который делал бы поиски по AJAX после N символы для:

  1. Делать более легкомысленный сдержись
  2. Не приносить их 14mil реестры

Ты можешь использовать это

5
ответ дан 01.12.2019, 08:15
  • 1
    Большое спасибо, я не подозревал этого widget, но никогда entend и # 237; c и # 243; mo оно функционировало, тестировать это и # 233; и я отвечаю тебе. – Diana Carolina Hernandez 16.12.2015, 04:39

Мне кажется, что не ответственность приложения эффективность поисков, если не базы данных.

Самое важное, чтобы делать консультацию работоспособные / мало дорогие в базе данных, состоит в том, чтобы иметь в виду некие вещи:

  • Проекция: количество колонн, которое возвращает твою консультацию. Это важно, из-за которого каждая колонна просит X байт в каждом реестре результата. В гигантских подмостках, это могут направлять проблему.
  • Выданный: Ты должен оставлять хорошо в просвете критерий выбора, чтобы возвращать самое меньшее количество возможных линий.
  • Пред-компиляция консультации: Избеги того, чтобы каждый раз, когда ты реализовал консультацию, эта была должна реализовывать план консультации непрерывно, так как он дорогой. Это проистекает того, что, в общем, осуществляются те же консультации без изменений.
  • План консультации: Проверять план консультации, чтобы предотвращать неадекватные методы выбора, выбранные механизмом базы данных и определять форму доступа к данным, который ты хочешь. Это основное, так как в больших наборах данных, механизмы склоняются к тому, чтобы делать плохие выборы относительно этого.

И есть другие методы, равной важности, когда вещи не решаются просто.

  • Индексация: Если нет индексов, у механизма базы данных будет необходимость искать во всем наборе реестров желанные результаты. Важно иметь индексы, чтобы облегчать эти поиски как будто это был телефонный справочник. Нужно уметь делать хороший выбор между простыми и составными индексами и между физиками и логиками.
  • Статистика: У самых передовых механизмов базы данных есть реестр (статистика) самых соглашенных индексов и у него есть виртуальное место особенно чтобы соглашаться более быстро на этих.
  • Разделения: Решение, чтобы делить большое количество реестров в меньших частях как твои критерии. Он используется много, чтобы избегать консультировать большие индексы или соглашаться на набор реестров, более подпертых локтем критерием внутри главного набора реестров.

Если твои проблемы превосходят этот тип вещей, начни иметь в виду такие темы как закоулок в памяти.

2
ответ дан 01.12.2019, 08:15

Чтобы мочь определять, если проблема - в консультации или в другой части, как кажется случай (конкретно, renderizado select с 14k поступающие данные), очень рекомендуемый она extensiГіn Джанго debug toolbar . Между другой informaciГіn Гєtil, он показывает тебя в nГєmero консультаций, реализованных в базу данных и nГєmero миллисекунд, которые к нему принесло выполнять каждую из них.

1
ответ дан 01.12.2019, 08:15