@Lepilov

Выбор связей между таблицами в БД?

Подскажите по правильности выбора архитектуры БД под задачу. Смысл следующий

Есть модель Vendors - по сути это коммерческая организация их может быть много

class Vendors(models.Model):
    name...
    country ....


Есть глобальная модель Modules - в ней описаны 10 вариантов существующих модулей. Можно делать модуль не активным глобально, тогда к нему нет доступа.

class Modules(models.Model):
    MODULES_NAME = (
                    ("Sourcing", "Sourcing"), ("SA", "SA"),
                    ("SXM", "SXM"), ("CLM", "CLM"),
                    .....
                    )
    module_name = models.CharField(max_length=50, choices=MODULES_NAME)
    active = models.BooleanField(default=True)


Таблица VendorModules которая связывает Vendor и Modules с возможность делать не активным конкретный модуль или несколько модулей относительно вендора. Т.е отключать модуль не на глобальном уровне.

class VendorModule(models.Model):
    vendor = models.OneToOneField('Vendors', on_delete=models.CASCADE, primary_key=True)
    active = models.BooleanField(default=True)


Модель Element - содержит информацию относящуюся к конкретному модулю конкретного вендора.

class Element(models.Model):
    info1...
    info2.....
    ....


В итоге добавляется в систему новый вендор, ассоциирует себя с некоторыми модулями -> вносит инфу по этим модулям - > может отключать у себя ассоциацию с некоторыми модулями. Как правильно сделать связи между моделями?
  • Вопрос задан
  • 146 просмотров
Решения вопроса 1
@Realmixer
Full stack Python (Django) web-developer
Предлагаю такую схему:
class Vendor(models.Model):
    ...

class Module(models.Model):
    MODULES_NAME = (
        ("Sourcing", "Sourcing"), ("SA", "SA"),
        ("SXM", "SXM"), ("CLM", "CLM"),
        ...
    )
    name = models.CharField(max_length=50, choices=MODULES_NAME)
    is_active = models.BooleanField(default=True)


class VendorModule(models.Model):
    vendor = models.ForeignKey(Vendor, on_delete=models.CASCADE)
    module = models.ForeignKey(Module, on_delete=models.CASCADE)
    is_active = models.BooleanField(default=True)
    info1 = models.TextField(max_length=500)
    info2 = models.TextField(max_length=500)

Связь модулей с вендорами осуществляется через VendorModule — фактически это связь многие-ко-многим с возможностью сохранения дополнительной информации. Назначение модели Element непонятно, поэтому дополнительная информация убрана в VendorModule. Но если вы считаете, что этого недостаточно, то можно сделать так:
class Element(models.Model):
    vendormodule = models.ForeignKey(VendorModule, on_delete=models.CASCADE)
    info1 = models.TextField(max_length=500)
    info2 = models.TextField(max_length=500)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы