Правильные способы сделать множественное соединение MySQL - PullRequest
0 голосов
/ 13 июня 2019

MySQL версия: 5.7

Здравствуйте.Я работаю над новым проектом django.

Пока что

Я принес 2 таблицы.

Auth (1st Table) содержит данные пользователя (например, id, email), пароль, имя и т. д.)

Бумага (2-я таблица) содержит информацию об исследовательской работе.

Таблица «Бумага» имеет 10 столбцов для разрешения пользователя.Только 10 пользователей могут читать статью, поэтому у меня есть модель для таблицы, например:

class DocDetail(models.Model):
    no = models.AutoField(primary_key=True)
    doc_id = models.CharField(null=False, default="", max_length=255)
    doc_name = models.CharField(null=False, default="", max_length=255)
    doc_pw = models.CharField(null=False, default="", max_length=255)
    view_perm_1 = models.IntegerField(null=True)
    view_perm_2 = models.IntegerField(null=True)
    view_perm_3 = models.IntegerField(null=True)
    view_perm_4 = models.IntegerField(null=True)
    view_perm_5 = models.IntegerField(null=True)
    view_perm_6 = models.IntegerField(null=True)
    view_perm_7 = models.IntegerField(null=True)
    view_perm_8 = models.IntegerField(null=True)
    view_perm_9 = models.IntegerField(null=True)
    view_perm_10 = models.IntegerField(null=True)
    folder = models.CharField(null=False, default="", max_length=255)
    url = models.CharField(null=False, default="", max_length=255)
    status = models.IntegerField(null=True)
    action_exp = models.DateTimeField(null=True)
    date_updated = models.DateTimeField(null=True)

столбцы view_perm указывают на идентификатор пользователя Auth Table.

Я хочу выбрать все переходыБумажные таблицы и пользовательские данные, которые связаны с каждым столбцом view_perm одним запросом.

Я думаю, что я в значительной степени не прав с моделированием.Я могу сделать выбор с 10 присоединиться, но это не выглядит правильно.Есть ли лучшая идея, чтобы заставить это работать?

Я довольно новичок в SQL, поэтому, пожалуйста, направьте меня в правильном направлении.

1 Ответ

0 голосов
/ 13 июня 2019

Это все виды неправильно.

Во-первых, вы никогда не должны абсолютно ни при каких обстоятельствах определять свою собственную аутентификацию. Используйте Джанго. (Обязательно определите пользовательскую модель пользователя, если она наследуется от AbstractBaseUser и поэтому использует встроенные функции для хранения и проверки паролей.)

Во-вторых, при определении отношений между моделями необходимо использовать поле отношения, а не целое число. В Django это ForeignKey, OneToOneField и ManyToManyField. В вашем случае кажется, что у вас есть отношение многие ко многим, поэтому используйте ManyToManyField.

Это также устраняет другую проблему, поскольку отношение «многие ко многим» определяется (за кулисами) как таблица ссылок, которая связывает идентификаторы пользователей с идентификаторами страниц. Так что все СОЕДИНЕНИЯ сделаны для вас.

Ваши модели должны выглядеть так:

class DocDetail(models.Model):
    no = models.AutoField(primary_key=True)
    doc_id = models.CharField(default="", max_length=255)
    doc_name = models.CharField(default="", max_length=255)
    doc_pw = models.CharField(default="", max_length=255)
    users = models.ManyToManyField('auth.User')
    folder = models.CharField(default="", max_length=255)
    url = models.CharField(default="", max_length=255)
    status = models.IntegerField(null=True)
    action_exp = models.DateTimeField(null=True)
    date_updated = models.DateTimeField(null=True)

(Я также удалил все null=False, поскольку это значение по умолчанию.)

Теперь, учитывая экземпляр DocDetail, вы можете получить разрешенных пользователей, просто выполнив:

my_doc_detail.users.all()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...