我几乎完成了我的数据映射器,但现在我正处于关系方面。
我将在这里尝试说明我的想法。我无法找到关于这个主题的好文章/信息,所以也许我正在重新发明轮子(当然,我可以使用一个大框架 - 但我想通过这样做来学习)。
1:1 关系
首先,让我们看一下 1:1 的关系。通常,当我们有一个名为“Company”的域类和一个名为“Address”的域类时,我们的 Company 类将具有类似 address_id 的内容。假设在大多数情况下,我们只显示公司列表,并且只有在有人查看详细信息时才需要地址。在这种情况下,我的数据映射器 (CompanyDataMapper) 只是延迟加载,这意味着它只会从数据库中获取 address_id,但也不会执行连接来获取地址数据。
一般来说,我对每个关系都有一个 getter 方法。所以在这种情况下,有一个 getAddress(Company companyObject) 方法。它接受一个公司对象,查找它的地址属性,如果它为 NULL,则使用该地址对象 (AddressDataMapper) 的 Mapper 类从数据库中获取相应的地址对象,并将该地址对象分配给指定的地址属性公司对象。
重要提示:是否允许数据映射器使用另一个数据映射器?
假设在大多数情况下,您需要公司对象和地址对象,因为您总是将它们一起显示在一个列表中。在这种情况下,CompanyDataMapper 不仅会获取公司对象,还会使用 JOIN 进行 SQL 查询以获取地址对象的所有字段。最后,它遍历记录集并为新对象提供相应的值,将地址对象分配给公司对象。
听起来很简单,到目前为止。
1:n 关系
这些怎么样?与 1:1 的唯一区别是,一个 Company 可能有多个 Address 对象。让我们看一下:当我们大部分时间只对公司感兴趣时,数据映射器只会将公司对象的地址属性设置为 NULL。address 属性是一个数组,它可以引用无、一个或多个地址。但我们还不知道,因为我们延迟加载,所以它只是 NULL。但是,如果我们在大多数情况下也需要所有地址呢?如果我们要显示一个包含所有公司及其所有地址的大列表?在这种情况下,事情开始变得非常丑陋。首先,我们不能为每个地址对象加入地址表五十次(我坚信这是不可能的,如果是,性能将低于零)。所以,当我们进一步思考这个问题时,它'
重要提示:这是真的吗?如果我有 10 家公司,每 10 个地址,我必须发送 100 个查询以获得 100 个地址对象吗?
m:n 关系
假设一个地址对象只包含国家、州、城市、道路和门牌号码。但一所房子可能是一座大型商业大厦,里面有很多公司。就像那些现代办公楼之一,任何人都可以租一个小ROM在其网站上炫耀这座塔。所以:许多公司可以共享同一个地址。
我还没有计划处理这种问题。
重要提示:可能这不是比 1:n 关系更大的问题吗?
如果有人知道一个很好的资源来详细介绍解决/实现这个问题,我会很高兴有一个链接!