当前位置: 首页 > 面试题库 >

将实体的ID重新用于其他不同种类的实体-理智的想法?

宦兴朝
2023-03-14
问题内容

我的(python)应用程序正在使用几个实体,其中许多实体处于1:1关系。例如:

class Main(ndb.Model):
    field1 = ndb.StringProperty()
    #peer_key = ndb.KeyProperty(kind='Peer')

class Peer(ndb.model):
    field2 = ndb.IntegerProperty()
    #main_key = ndb.KeyProperty(kind='Main')

某些Main实体可能具有完全按1:1关系的Peer实体(在实体之后创建Main)。

我当时在想,在创建Peer实体时,我可以简单地指定一个等于对应Main实体ID的数字ID(由数据存储区自动生成,因此保证是唯一的):

main_entity = Main(field1='blah')
main_entity.put()

peer_entity = Peer(id=main_entity.key.id(), field2=10)
peer_entity.put()

这样,我可以大大简化我的应用程序的逻辑,而无需存储和处理实体密钥以交叉引用这些实体,尤其是在跨请求传递它们时。例如,在拥有主要实体的情况下,我可以简单地执行以下操作:

peer_entity = Peer.get_by_id(main_entity.key.id())

同样,在有对等实体的情况下:

main_entity = Main.get_by_id(peer_entity.key.id())

根据文档,密钥是(kind, id)成对的,这意味着只要类型不同且id是唯一的,我就 不会 遇到问题。我到目前为止(在开发服务器上)所做的测试似乎运行良好。

我的想法是正确的还是我遗漏了什么(到目前为止,我在测试中只是很幸运)?


问题答案:

我多年来一直使用这种方法,从来没有任何问题。

例如,每次更新实体时,每个索引字段也会更新。因此,我经常将一个复杂的实体分为“很少更新”部分和“频繁更新”部分,并且对两个实体使用不同种类但相同的ID,例如AdEntity和AdCounterEntity。这样,正如您正确观察到的那样,由于只需记住一个ID即可根据需要检索两个实体,因此简化了应用程序逻辑。



 类似资料:
  • “对于实体,Id属性不能为null,因此需要将该类映射为ValueObject。如果是这样,Id属性将被视为常规属性,而不转到该对象的GlobalId。” 我的问题是: 如果Id为NULL,为什么不能将实体视为新的? null

  • 问题内容: 我正在使用hibernate作为持久层。存在于同一表中的2个实体通过单表继承策略扩展了一个超类。 我有一个ID为4的B实例。如何将此实例的类型更改为C并保留其ID(4)? 上面的代码因 有可能吗? 问题答案: Hibernate尝试使持久性尽可能地透明-这意味着它尝试遵循与普通Java对象相同的原则。现在,用Java改写您的问题,您将获得: 如何将B类的实例转换为(不兼容的)C类的实例

  • 我是openNlp的新手。我开始训练一个模型(TokenNameFinderTrainer),以识别名称。到目前为止还不错,但现在我想识别组织(例如“Microsoft”)。 我的问题是:opennlp默认识别哪些类型的实体?(如果有的话...) 我看到它可以处理

  • 在这种情况下,我希望检索数据,但在返回数据之前,我希望在不保存/持久化的情况下对其进行更改。 这是我的Rest控制器: 以下是服务实现: 最初我在服务上有注释。通过删除它而不在方法中使用它,我首先想到的是会话将使用存储库打开和关闭,如这里的答案所示。 这不起作用,我在评论中看到“会话将持续整个HTTP请求处理过程。”所以,在我添加的服务中 然后在我添加的方法中 在我做任何改变之前。然而,我所做的任

  • 不确定为什么UserEntity没有被填充为此调用的一部分。