问题标签 [datamapper]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
design-patterns - 数据映射器和关系:实施策略?
我几乎完成了我的数据映射器,但现在我正处于关系方面。
我将在这里尝试说明我的想法。我无法找到关于这个主题的好文章/信息,所以也许我正在重新发明轮子(当然,我可以使用一个大框架 - 但我想通过这样做来学习)。
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 关系更大的问题吗?
如果有人知道一个很好的资源来详细介绍解决/实现这个问题,我会很高兴有一个链接!
datamapper - 数据映射器:域对象永远不应该调用它的数据映射器?
我正在阅读 Martin Fowler 的关于企业应用程序架构设计模式的书,但是是德文版。因此,在我的书第 193 页(如果你有的话)中,他用德语写道,域对象(业务逻辑层的对象)不应该依赖于它们的数据映射器。那么这意味着什么?如果我有一个 User 对象和一个 UserDataMapper 类,那么 User 的任何方法都不能调用 UserDataMapper 的方法吗?或者换句话说:如果没有 UserDataMapper,是否仍然可以使用 User 类而不会出错?
database - 如何在 Data Mapper 中加载一对多关系?
虽然我会在 1:1 关系中选择 Ghost 模式,但我不确定这在 1:n 关系中是否足够。
例如,当我加载可能有一百个 Item 对象的 Order 对象时,我会首先将 NULL 分配给 items 属性。
问题是:
A)我是否应该分配 NULL,然后在首次访问 items 属性时查找该项目的所有订单并加载所有订单?
B)或者我应该只加载一个仅包含所有 order_id 的轻量级记录集并加载 100 个仅设置了 order_id 的 Item Ghost 对象,但其他所有内容均为 NULL - 并且一旦访问 Item 对象以从中获取更多详细信息,延迟加载特定的 Item 对象数据?
oop - Finder 方法应该是数据映射器的一部分,还是域类的一部分?
在 Martin Fowler 的企业应用程序架构模式一书(德语第 229 页,Lazy Load)中,他给出了一个包含以下代码的示例:
如您所见,finder 方法似乎是域类 Product 的一部分。这让我有点困惑,因为我认为与从某个地方(通常是数据库,但业务逻辑不应该关心)检索对象相关的所有内容都应该是 Data Mapper (PersonDataMapper) 类的一部分。可能我只是错过了什么?
php - 模型和映射器关系
我目前正在开发一个带有模型、映射器和控制器的小型应用程序。我的问题是,(因为我没有找到任何匹配的答案),当我们遇到以下情况时,映射器如何与模型(&控制器)交互。
这将尽可能好地工作,模型有一个 id,映射器可以使用它检索所需的用户(并将其映射回用户对象)。
我的问题是,我该如何包装这段代码,我的意思是,这段代码非常原始,绝对不建议在控制器中使用它。我想缩短它,但我不完全知道如何:
它应该看起来更像:
但这是更多的代码。我是否应该在父控制器类中包含该过程,以便无需显式调用getMapper
即可轻松访问?$this->_mapper
问题是,我不想破坏映射器模式,所以模型不应该直接访问任何 SQL/Mapper 方法$model->find()
,但我不想有很多代码只是为了首先创建一个映射器并执行此操作这个等等
我希望你能理解我一点,我自己已经很困惑了,因为我对许多模式和映射/建模技术都是新手。
ruby - 使用模块通过 Datamapper 定义属性
所以我正在建立一些模型,它们基于 2 个抽象基类(或者更确切地说它们曾经是类)。在 Datamapper 为我的用例处理 STI 遇到了很多麻烦之后,这似乎是他们灯塔页面上的一个开放错误,我决定改为使用模块来定义所有属性以保持我的模型干燥。不幸的是,我遇到了范围界定问题,更糟糕的是,我必须使用 2 级继承。这是我的代码:
我得到的错误是:
我在这里不知所措。任何人都知道我可以如何解决这个问题,或者更好,我可以用更聪明的方式来解决这个问题吗?
ruby - DataMapper 关联中的外键名称
我目前正在开发一个基于现有数据库的新应用程序,使用 DataMapper 进行数据访问。但是,它在处理外键时的约定不是数据库使用的。
例子:
有什么办法可以让 DataMapper 使用的外键成为“invoiceId”而不是它目前尝试使用的“invoice_id”(如上面的评论所示)?我知道这可以通过添加普通字段来完成,:field => 'fieldName'
但我发现没有这样的关联方式。
sql - 简化 SQL 查询的不等式
作为参考,这个问题令人难以置信,因此感谢所有帮助解决这个问题的人。
我正在尝试在事件长度不同的预订程序中定位潜在的事件冲突。
(a ≤ x && e ≥ y) || (a ≥ x && e ≤ y) || (a ≤ x && e ≤ y) || (a ≥ x && e ≥ y)
我正在使用 DataMapper 来完成此操作,但我之前的查询是错误的。然后我想出了上述内容,但我不确定如何将其转换为查询。以下是我的错误查询以供参考。
design-patterns - 谁应该建立这种关系?实体还是数据映射器?
有四个类:
StudentBase , CourseBase和 StudentDataMapper , CourseDataMapper
Student 对象可以与 Course 对象有关系。一个学生可以有很多课程。一门课程可以被许多学生参观。
在 ER 图中,Student 实体有一个名为“courses”的属性,但课程对他的学生一无所知。作为回报,课程没有称为“学生”的属性。
这些类中的哪一个应该执行关系的创建?
编辑:这是系统层!在业务逻辑层中,开发人员将 StudentBase 和 CourseBase 子类化以创建 Student 类和 Course 类。创建这些类的开发人员将看不到任何代码,除了他自己的业务逻辑代码。
ruby - 如何进行许多<-->许多 DataMapper 集合的交集?
我正在尝试返回与标记主题相关的数据映射器集合的交集。
在我们进一步讨论之前,我应该指出显而易见的:
这将返回一个 UNION,这意味着我得到所有带有“shim”或“sham”作为标签的主题。
我想要做的是返回所有带有“shim”和“sham”作为标签的文章。
好的,我们有了数据——现在我们还有一个问题。我们需要把它作为一个 DataMapper 集合,这样我就可以像这样有效地钻取我的结果:
这当然是不可能的,因为@blah 现在是一个数组而不是 DataMapper 集合。
上述更简洁的版本:
虽然我们仍然得到一个数组.....根据http://www.mail-archive.com/datamapper@googlegroups.com/msg02092.html这应该是可能的