У меня есть модели, соответствующие таблицам базы данных. Например, класс House имеет столбцы «color», «price», «square_feet», «real_estate_agent_id».
Мне очень часто хочется отображать имя агента, когда я отображаю информацию о доме. В результате класс моего дома имеет следующие поля:
class House {
String color;
Double price;
Integer squareFeet;
Integer realEstateAgentId;
String realEstateAgentName;
}
Я имею в виду realEstateAgentName как виртуальное поле, так как оно извлекается из внешней таблицы (объединение по real_estate_agent_id).
Мне это не кажется правильным, поскольку в нем смешиваются фактические столбцы базы данных со свойствами стороннего объекта. Но это быстро, и во многих случаях это действительно хорошо работает.
В других случаях я обнаруживаю, что делаю что-то вроде этого:
class House {
String color;
Double price;
Integer squareFeet;
Integer realEstateAgentId;
RealEstateAgent realEstateAgent;
}
Как видите, я храню фактический объект, соответствующий идентификатору, который хранится в таблице House.
Я склонен принимать решение о сохранении всего объекта в сравнении с некоторой ключевой информацией, связанной с идентификатором (например, именем), в зависимости от вероятности получения доступа к другой информации об объекте, который он представляет.
У меня есть несколько вопросов:
Из двух методов, которые я смешивал и сопоставлял, какой из них лучше? Я склоняюсь к сохранению id + объекта, а не вытаскиваю только свойства из постороннего объекта, которые, я думаю, могут мне понадобиться. Из двух это кажется более «правильным». Но это не идеально, потому что во многих случаях у меня нет необходимости увлажнять весь посторонний объект, и это может привести к неоправданной растрате ресурсов или не будет осуществимо из-за количества данных или количества объединений, которые требовать, когда у меня нет никакой пользы для всей вводимой информации. Учитывая, что это так, это кажется плохим выбором дизайна, потому что у меня будет много пустых полей, которые на самом деле не равны нулю в моей базе данных, но они так в памяти просто потому, что их не нужно было заполнять - теперь я должен отслеживать, какие из них я заполнил.
Но лучше ли хранить идентификатор рядом с объектом, который он представляет? Должен ли я даже хранить объект как свойство или он должен находиться снаружи на некоторой карте, где ключом является идентификатор?
В мире Объектов кажется, что идентификатор даже не должен храниться как свойство, поскольку чужой Объект, который он представляет, является логической заменой. Но с учетом того, что все тесно связано с реляционной базой данных, это кажется нереальным.
Является ли эта разочаровывающая нечистота моих моделей / классов чем-то, с чем мне просто нужно смириться, или существуют шаблоны, которые решают эту проблему, имея какое-то подклассификация форка или родителя / потомка, где каждый находится " чистый "объект, а другой плоский, как база данных?
РЕДАКТИРОВАТЬ : Я ищу предложения по дизайну, а не конкретные платформы ORM, такие как Hibernate / nHibernate / и т.д. Конкретный язык, на котором я работаю, не имеет решения ORM для моей языковой версии, которой я доволен, и примеры были Java-esque, но это не то, на чем написан мой исходный код.