Я почти закончил свой Data Mapper, но теперь я нахожусь в точке, где дело касается отношений.
Я попытаюсь проиллюстрировать свои идеи здесь. Я не смог найти хорошие статьи/информацию по этой теме, поэтому, возможно, я заново изобретаю колесо (наверняка я, я мог бы просто использовать большую структуру, но я хочу учиться, делая это).
Отношения 1:1
Во-первых, давайте посмотрим на отношения 1:1. В общем, когда у нас есть класс домена под названием "Компания", а один называется "Адрес", наш класс компании будет иметь что-то вроде address_id. Допустим, в большинстве случаев мы просто показываем список компаний, и адрес нужен только тогда, когда кто-то смотрит на детали. В этом случае мой Data Mapper (CompanyDataMapper) просто загружается лениво, то есть он просто извлекает этот адрес_ид из базы данных, но не будет делать соединение, чтобы получить данные адреса.
В общем, у меня есть метод getter для каждого отношения. Таким образом, в этом случае есть метод getAddress (Company companyObject). Он принимает объект компании, ищет его свойство адреса и - если он NULL - выбирает соответствующий объект Address из базы данных, используя класс Mapper для этого объекта Address (AddressDataMapper) и присваивает этот адресный объект свойству адреса указанного объект компании.
Важно: разрешен ли Map Mapper использовать другой Data Mapper?
Допустим, что в большинстве случаев вам нужен как объект компании, так и адресный объект, потому что вы всегда показываете его в списке все вместе. В этом случае CompanyDataMapper не только извлекает объекты компании, но и SQL-запрос с JOIN также получает все поля адресного объекта. Наконец, он выполняет итерацию по набору записей и передает новые объекты с соответствующими значениями, присваивая объект адреса объекту компании.
Звучит просто, пока.
1: n Отношения
Как насчет этих? Единственное отличие от 1:1 состоит в том, что у Компании может быть несколько объектов Address. Давайте посмотрим: когда мы большую часть времени интересуемся только компанией, Data Mapper просто установит для свойства адресов объекта компании значение NULL. Свойство адресов - это массив, который может ссылаться на ни один, один или несколько адресов. Но мы еще не знаем, поскольку мы лениво загружаемся, так что это просто NULL. Но что, если нам понадобится все адреса в большинстве случаев? Если бы мы отобрали большой список со всеми компаниями вместе со всеми их адресами? В этом случае все начинает становиться действительно уродливым. Во-первых, мы не можем присоединиться к таблице адресов пятьдесят раз для каждого объекта адреса (я твердо верю, что это невозможно, и если это так, производительность будет ниже нуля). Итак, когда мы думаем об этом дальше по дороге, в этом случае невозможно ЛЮБИТЬ лениво.
Важно: Это правда? Должен ли я отправлять 100 запросов для получения 100 адресных объектов, если у меня 10 компаний с каждыми 10 адресами?
m: n Отношения
Предположим, что адресный объект содержит только страну, страну, город, дорогу и номер дома. Но один дом может быть большой бизнес-башней с множеством компаний в них. Как один из тех современных офисных зданий, где каждый может арендовать небольшой ром, чтобы показать эту башню на своем веб-сайте. Итак: многие компании могут использовать один и тот же адрес.
Я еще не планирую заниматься этой проблемой.
Важно: Вероятно, это не большая проблема, чем отношения 1: n?
Если кто-то знает хороший источник, который подробно рассказывает о его решении/реализации, я был бы рад ссылке!