2013-06-01 32 views
3

我正在用MongoDB在后端进行Java开发。我有两个需要彼此列表的数据库对象。 EX-存储对象列表的位置以及相互引用的位置?

客户对象包括 - List<MediaServer>

的MediaService对象包含 - List<Customer>

1)我应该删除列表中的一个,相同的信息不被存储在两个地方?例如删除媒体服务器的客户列表。当我拉客户时,遍历所有媒体服务器以确定客户被分配到哪些媒体服务器。

2)有没有更好的地方在MongoDB中存储这种风格的信息?

谢谢!

+0

不能将引用存储为ID列表并在需要时检索真实对象吗?这样,就没有重复,并且很容易检索参考。 –

+0

@NicolasMorel是的,我应该提到,列表只是简单的ID(MongoDB中的dbRefs)。重复不是对象重复,而是关系重复 - 即客户和媒体服务器之间的关系在两个列表中。 – mkeathley

回答

1

在MongoDB中,将数据复制到多个地方更为正常。如果你的清单没有经常变化,那么存储这两个清单并没有真正的缺点 - 现在的硬盘空间并不像昂贵的正常化那样昂贵。

Mongo(以及任何应用程序开发)始终牢记的一件事就是弄清楚你的访问模式是什么,并根据频繁的模式创建你的模式。如果您定期阅读这些列表,但不会更新它们,那么在数据库中同时列出这两个列表将会很好。

但是,如果您经常更改两个列表,您可能会发现每次都在两处更新数据。

但是,您还应该记住,如果您要存储ID列表,那么当您想要获取此ID的完整对象/文档时,它将需要往返服务器。因此,如果对于每个客户(例如),您总是需要关于所有MediaServers的所有信息,则需要通过网络为您的客户列表中的每个MediaServer ID进行旅行。

0

我建议你使用Soft References为一种列表,并定期为其他的参考。或者,如果客户端和服务器记录的存在被“挂钩”到其他引用对象上,那么这两种列表都应该包含软引用。

弱引用也许值得考虑。如果内存使用是一个问题。关于这个请参见What is the difference between a soft reference and a weak reference in Java?

PS - 我的建议与您的对象来源于MongoDB或任何其他类型的数据库无关。