这可能是一个愚蠢的问题,但我一直想知道最好的方法是什么。
假设我们有一个包含两个表的数据库:Users
和Orders
(一个用户可以有多个订单),并且在任何OOP语言中,您都有两个类来表示这些表User
和Order
。在数据库中,很明显“订单”将具有“用户”ID,因为它是一对多的关系(因为一个用户可以有很多订单),并且用户将没有任何订单ID。但在代码中,以下三种方法中的最佳实践是什么?
a)用户是否应该有一系列订单?
b)订单是否应具有用户ID?
c)订单是否应该引用用户对象?
或者有更有效的方法来解决这个问题吗?我总是以不同的方式做到这一点,它们都有利有弊,但我从未问过专家的意见。
提前致谢!
答案 0 :(得分:1)
在这种情况下,如果您对用户执行的操作也涉及他们拥有的订单,则用户可以拥有一系列订单。
每当我设计我的类时,相关的对象都包含彼此的指针,因此我可以从用户和订单中的用户访问订单。
我不相信有最好的做法,因为它实际上取决于你想要完成的事情。通过用户和订单,我可以看到您从订单开始并需要访问用户,反之亦然;因此,在您的情况下,您应该以两种方式映射对象。
一句警告,请注意不要创建循环引用。如果删除两个对象而不删除引用,则可能会造成内存泄漏。
答案 1 :(得分:0)
您正在询问所谓的“对象关系映射”(ORM)。我认为学习你想要学习的东西的最好方法是看一些完善的ORM库[比如ActiveRecord(Ruby)或Hibernate(Java)],看看他们是怎么做的。
考虑到这一点:
a)如果应用程序需要它,则应该可以访问通过用户对象表示用户订单的对象的数组(或类似的枚举)。然而,这通常最好涉及延迟加载(即,当用户从数据库中取出时,通常不会从数据库中提取订单......随后在应用程序需要访问它们时查询订单)。延迟加载对象后,ORM可以对它们进行缓存,以消除对该实例进一步查询的需要。
b)除非出于性能原因,您只需提取特定列,否则在下订单时通常会拉出所有列。所以它将包括用户ID。
c)答案也适用于此。