Как мне избежать круговых отношений в моей диаграмме классов

Привет, у меня есть вопрос о некоторых круговых отношениях, с которыми я сталкиваюсь при разработке моей базы данных. Я прочитал еще несколько похожих вопросов, но не смог решить мою проблему, поэтому вот моя диаграмма классов:введите описание изображения здесь

и вот логика:

  • Документ принадлежит к DocumentType(счет, форма заказа, ..)
  • documentField (date, address, nameClient,...) принадлежит documentType (каждый documentType имеет свои собственные поля
  • FieldValue - это значение поля документа, которое будет сохранено в базе данных, оно принадлежит как document, так и documentField, the value should be saved according to the fieldType ( date , char , long , double... )

Однако, с точки зрения архитектора базы данных, это циклическое отношение является неправильным, поскольку оно может привести к проблемам целостности:

Если у вас есть какие-либо идеи, как с этим справиться, просим вас прокомментировать.

Спасибо заранее за вашу помощь.

2 ответа

Решение

Здесь ситуация даже проще, чем в вашем другом подобном вопросе. Понятно, что два нижних класса описывают абстрактную структуру документа, а два верхних описывают конкретные документы.

Абстрактные элементы никогда не должны зависеть от конкретных, поэтому просто сделайте две вертикальные ассоциации однонаправленными и наведите их на абстрактные классы. Это аккуратно сломает круговую зависимость.

Кроме того, я бы дополнительно уточнить вашу модель:

  • Ассоциация между Document и FieldValue должна быть составной.
  • Некоторые более низкие кратности должны быть изменены на 0 (вместо 1), чтобы сделать вашу модель более гибкой (например, почему бы не разрешить Document без DocumentFields? Очевидно, что вы рано или поздно добавите некоторые поля, но вы можете возможно сначала создайте пустой документ и сохраните его)

ОБНОВИТЬ:

введите описание изображения здесь

Я не вижу цели твоего моделирования. Мне кажется, что вы смешиваете метаэлементы ( DocumentType и DocumentField) с элементами моделирования экземпляров метаэлементов (Document и FieldValue).

Какова семантика отношений Document ->DocumentType? это отношения "isA"? если так, почему бы вам не использовать расширение / обобщение (наследование) или реализацию интерфейса (реализацию)?

Зачем вам обратное отношение DocumentType ->Document? если бы вы могли избежать этого, у вас не было бы круговых отношений.

[Обновление] Почему бы вам не переименовать DocumentType в AbstractDocument и сделать его абстрактным классом. Затем замените ассоциацию из Document на DocumentType с расширением (обобщением). Наконец, создайте ассоциацию 1..* из AbstractDocument для себя

[Update2] Также учтите, что согласно вашему объяснению ассоциация между DocumentType и DocumentType отличается и, таким образом, отличается (другая ассоциация) от ассоциации, которая идет от DocumentType к Document.

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