我正在尝试使用db4o作为数据存储,所以为了掌握它,我想我自己构建了一个跟踪Web应用程序的简单问题(在ASP.NET MVC中)。我发现db4o在快速开发方面非常出色,特别是对于像这样的小型应用程序,它也无需使用ORM。
然而,由于来自SQL Server / MySQL背景,我有点不确定在关系方面我应该如何构建我的对象(或者我可能只是没有正确理解对象数据库的工作方式)。
这是我的简单示例:我只有两个模型类,问题和人。
public class Issue
{
public string ID { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public DateTime? SubmittedOn { get; set; }
public DateTime? ResolvedOn { get; set; }
public Person AssignedBy { get; set; }
public Person AssignedTo { get; set; }
}
public class Person
{
public string ID { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public string Password { get; set; }
}
ID
属性只是.NET Guid.NewGuid()
帮助程序生成的GUID字符串。
所以这就是我最初认为该应用程序可行的方式;请忽略任何安全问题等,并假设我们已经在数据库中存储了一些Person
个对象:
Person
,并将他/她的GUID ID存储为会话变量。重定向到应用主屏幕。 Person
个对象(通过其GUID ID)以获取表示登录用户的对象和表示已分配故障单的用户的对象。创建一个新的Person
对象(填充已发布的表单数据),将Person
个对象分配给Issue
对象的AssignedBy
和AssignedTo
属性,然后存储它这意味着我针对每个Person
记录存储了两个Issue
个对象。但是如果我更新原始Person
会发生什么 - 在各种问题对象中更新所有存储的对Person
的引用,或者我是否必须手动处理? 他们是引用还是复制?
为AssignedBy和AssignedTo字段存储GUID字符串(如下所示)会更好/更有效率,然后每次都根据它查找原始人吗?
public class Issue
{
public string ID { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public DateTime? SubmittedOn { get; set; }
public DateTime? ResolvedOn { get; set; }
public string AssignedByID { get; set; }
public string AssignedToID { get; set; }
}
我认为我只是陷入某种困扰我的思维方式。如果有人能够清楚地解释这将是最有帮助的!
答案 0 :(得分:2)
Object-Databases尝试提供与内存中对象相同的语义。经验法则是:它像内存中的对象一样工作。对象数据库存储数据库中对象之间的引用。更新对象时,该对象是更新。如果你有对这些对象的引用,你会看到更改后的版本。
在您的情况下,Issue-objects引用person对象。当您更新该人时,所有涉及它的问题都会“看到”更新。
当然,诸如int,strings,longs等原始类型的处理方式与值对象类似,而不是引用对象。此外,数组也像db4o中的值对象一样处理,这意味着数组与对象一起存储而不是作为引用存储。其他所有内容都存储为参考,甚至是List或Dictionaries等集合。
答案 1 :(得分:1)