来自关系数据库背景,我应该如何在db4o(或任何对象数据库)中建模关系?

时间:2010-08-10 19:19:07

标签: database oop relational-database db4o

我正在尝试使用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个对象:

  1. 用户登录。查询数据库中与用户名和密码匹配的Person,并将他/她的GUID ID存储为会话变量。重定向到应用主屏幕。
  2. 登录用户创建新的发行票证,从下拉列表中选择要将其分配给的用户。他们填写其他详细信息(标题,描述等),然后提交表格。
  3. 查询数据库中的Person个对象(通过其GUID ID)以获取表示登录用户的对象和表示已分配故障单的用户的对象。创建一个新的Person对象(填充已发布的表单数据),将Person个对象分配给Issue对象的AssignedByAssignedTo属性,然后存储它
  4. 这意味着我针对每个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; }
    }
    

    我认为我只是陷入某种困扰我的思维方式。如果有人能够清楚地解释这将是最有帮助的!

2 个答案:

答案 0 :(得分:2)

Object-Databases尝试提供与内存中对象相同的语义。经验法则是:它像内存中的对象一样工作。对象数据库存储数据库中对象之间的引用。更新对象时,该对象是更新。如果你有对这些对象的引用,你会看到更改后的版本。

在您的情况下,Issue-objects引用person对象。当您更新该人时,所有涉及它的问题都会“看到”更新。

当然,诸如int,strings,longs等原始类型的处理方式与值对象类似,而不是引用对象。此外,数组也像db4o中的值对象一样处理,这意味着数组与对象一起存储而不是作为引用存储。其他所有内容都存储为参考,甚至是List或Dictionaries等集合。

答案 1 :(得分:1)