Является ли таблица последователей последователем многих ко многим? - PullRequest
0 голосов
/ 07 июня 2018

У меня две модели.Одна модель - это таблица «Пользователи», которая содержит поля типа id, username, email, а у меня есть другая таблица, которая используется, чтобы показать последователя и следующие отношения.Показана следующая модель:

class Following(models.Model):
    target = models.ForeignKey('User', related_name='followers', on_delete=models.CASCADE, null=True)
    follower = models.ForeignKey('User', related_name='targets', on_delete=models.CASCADE, null=True)

    def __str__(self):
        return '{} is followed by {}'.format(self.target, self.follower)

Я сделал это, предполагая, что отношения между пользователями и подписчиками являются отношениями один ко многим (один пользователь может иметь много подписчиков, а также может следовать за многими).Это правильно?Или это должно быть отношение многих ко многим.Если так, то почему?Я видел много случаев, когда эта схема таблицы была как много ко многим, так и один ко многим.

Класс пользователя:

class User(AbstractBaseUser):
    username    = models.CharField(max_length=15, unique=True)
    email       = models.EmailField(max_length=100, unique=True)
    date_joined = models.DateTimeField(auto_now_add=True,
                                       null=True) 
    active      = models.BooleanField(default=True)
    staff       = models.BooleanField(default=False)
    admin       = models.BooleanField(default=False)

1 Ответ

0 голосов
/ 07 июня 2018

Использование предикатов [px] и ограничений [cx.y] .


[p1] User (UserID)существует.

[c1.1] Пользователь идентифицируется по идентификатору пользователя.

user {UserID}  -- p1
 KEY {UserID}  -- c1.1

[p2] Follower (FollowerID)следующий автор (AuthorID).

[c2.1] Подписчик - это пользователь.

[c2.2] Автор - пользователь.

[c2.3] Для каждого подписчика этот подписчик может подписываться более чем на одного автора.

[c2.4] Для каждого автораза этим автором может следовать более одного подписчика.

[c2.5] Для каждой комбинации автора и подписчика эта комбинация этого автора и этого подписчика может встречаться не более одного раза.

[c2.6] Авторы не могут следовать за собой.

following {AuthorID, FollowerID} -- p2
      KEY {AuthorID, FollowerID} -- c2.5, c2.3, c2.4

FOREIGN KEY {FollowerID} REFERENCES user {UserID} -- c2.1
FOREIGN KEY {AuthorID}   REFERENCES user {UserID} -- c2.2

      CHECK AuthorID != FollowerID                -- c2.6

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

...