Вечный двигатель третьего рода. Неканонические размышления о бизнес-системах, или О чём стоит сначала подумать. Модели данных и бизнес-логика. Олег Анатольевич Мостовлянский
Чтение книги онлайн.
Читать онлайн книгу Вечный двигатель третьего рода. Неканонические размышления о бизнес-системах, или О чём стоит сначала подумать. Модели данных и бизнес-логика - Олег Анатольевич Мостовлянский страница 4
Атрибут Unity::path является производным (образно говоря, суммой по некоторым – конкретным для каждой имплементации – правилам) от полной иерархии связанных по placed_on объектов Placeholder, а именно атрибутов Placeholder::path. Содержимое его, соответственно, меняется синхронно изменениям в иерархии связанных объектов Placeholder (как это будет реализовано – на уровне базы данных, или же на уровне приложения – целиком на совести имплементатора).
Возможно, это некое нарушение «стройности изложения», но подобные – явно необходимые – случаи денормализации всё же лучше предусматривать заранее, чтобы по возможности избегать множественных итераций при дизайне структур данных.
*)
Поскольку информация о местоположении хранимой единицы может либо содержаться в атрибуте Unity::path, либо быть закодирована в поле Unity::code, то для случая обязательного наличия информации о местоположении Unity должно существовать и быть заполнено хотя бы одно из этих полей.
Коллекции (Collection)
Добавим теперь «второе лицо» сущности Unity – способность представлять собой объект Collection. Сделать это можно разными способами – в зависимости от конкретной концепции организации коллекций.
Для простоты и наглядности просто представим ситуацию в виде графа:
То есть, каждая единица может быть (либо не быть) коллекцией ненулевого числа отдельных хранимых единиц (связь collection_of), а каждая хранимая единица заведомо существует и может входить (либо не входить) в различное число коллекций (показано связью collected_in).
Например, роман «Война и мир» Льва Николаевича Толстого (бумажная книга без приложений в виде компакт-диска с аудио-версией или ролевой игрой по сюжету) коллекцией сам не является, но в принципе может являться частью коллекции «Сочинения Л. Н. Толстого» (если какое-либо издательство выпустило такую серию). Но: если коллекцией является некое «Собрание сочинений Л.Н.Толстого в… томах», то элементом такой коллекции будет не конкретное произведение, а «Том номер такой-то». А какие произведения будут в этом томе – уже дело содержания. В общем, хозяин – барин, но принцип понятен.
Оговорка насчёт «бумажной книги без приложений» весьма существенна: книга по какой-либо проблеме программирования, к которой прилагается диск с примерами, в данной схеме – уже коллекция.
Каких-то дополнительных специфических атрибутов – по сравнению с «базовой» Unity – Collection не предполагает. Однако появляется некоторая поведенческая специфика:
– экземпляр Unity не может быть Collection для самого себя;
– удалён может быть только тот экземпляр Unity, который ни для кого более не является Collection.
То есть:
– связь collected_in объекта Unity не может указывать на самого себя;
– у удаляемого экземпляра Unity не должно быть связей collection_of.