Является ли таблица последователей-подписчиков отношениями "многие ко многим"?

У меня две модели. Одна модель - это таблица «Пользователи», которая содержит такие поля, как 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)

Вам необходимо предоставить более подробную информацию о потребностях вашего конкретного приложения. В нынешнем виде я не знаю, может ли кто-нибудь сказать, основываясь на информации здесь, являются ли «Пользователи» и «Подписчики» «один ко многим» или «многие ко многим».

Brian 07.06.2018 16:26

@Brian Я обновил вопрос с помощью класса User. Я думаю, что у пользователя есть отношения "один ко многим" с таблицей подписчиков.

user2896120 07.06.2018 23:16
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
804
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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


[p1] Пользователь (UserID) существует.

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

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

[p2] Последователь (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

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

Хм, я вижу, внутри таблицы есть отношения "многие ко многим". Какая польза от поля, имеющего отношение "многие ко многим"?

user2896120 07.06.2018 23:19

@ user2896120 это просто следствие логической модели, см. c2.3 и 2.4.

Damir Sudarevic 08.06.2018 18:03

Так это больше о логике, чем о пользе?

user2896120 09.06.2018 23:26

@ user2896120 ну да - "отношение" - это модельная речь (OO, ERD); логика здесь суть.

Damir Sudarevic 10.06.2018 14:41

Другие вопросы по теме