代码之家  ›  专栏  ›  技术社区  ›  Mark Bell

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

  •  2
  • Mark Bell  · 技术社区  · 14 年前

    然而,由于我来自sqlserver/MySQL的背景,我有点不确定当涉及到关系时我应该如何构造我的对象(或者我只是没有正确理解对象数据库的工作方式)。

    下面是我的简单示例:我只有两个模型类,Issue和Person。

    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字符串 Guid.NewGuid() 帮手。

    Person 存储在数据库中的对象:

    1. 用户登录。在数据库中查询 它匹配用户名和密码,并将其GUID id存储为会话变量。重定向到应用程序主屏幕。
    2. 登录用户从下拉列表中选择要分配给的用户,创建一个新的问题票证。他们填写其他细节(标题、描述等),然后提交表格。
    3. 查询 数据库中的对象(通过其GUID ID)来获取表示已登录用户的对象和表示已将票证分配给的用户的对象。创建新的 对象(用发布的表单数据填充),指定 对象到 Issue AssignedBy AssignedTo 属性,并存储它。

    针对每个存储的对象 记录。但是如果我更新了原版会怎样呢 所有存储的引用 在各种问题对象更新,还是我必须手动处理? 它们是参考资料,还是副本?

    如果只为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 回复  |  直到 14 年前
        1
  •  2
  •   Gamlor Gabriele Ran    14 年前

    当然,诸如int、string、long等基本类型的处理方式类似于值对象,而不是引用对象。另外,数组的处理方式与db4o中的值对象类似,这意味着数组与对象一起存储,而不是作为引用。其他所有内容都存储为引用,甚至包括列表或字典之类的集合。