作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
面向文档的数据库(尤其是 RavenDB)真的很吸引我,我想尝试一下它们。然而,作为一个非常习惯关系映射的人,我试图思考如何在文档数据库中正确地建模数据。
假设我的 C# 应用程序中有一个包含以下实体的 CRM(省略了不需要的属性):
public class Company
{
public int Id { get; set; }
public IList<Contact> Contacts { get; set; }
public IList<Task> Tasks { get; set; }
}
public class Contact
{
public int Id { get; set; }
public Company Company { get; set; }
public IList<Task> Tasks { get; set; }
}
public class Task
{
public int Id { get; set; }
public Company Company { get; set; }
public Contact Contact { get; set; }
}
Company
文档,因为联系人和任务在公司之外没有目的,大多数时候查询任务或联系人也会显示有关关联公司的信息。
Task
实体。假设业务要求任务始终与公司相关联,但也可选择与任务相关联。
Tasks
表并拥有
Company.Tasks
与公司的所有任务相关,而
Contact.Tasks
仅显示特定任务的任务。
Company.Tasks
中列出每个联系人的列表并将与联系人相关联的任务放入列表中。不幸的是,这意味着如果您想查看公司的所有任务(可能很多),您必须将公司的所有任务与每个联系人的所有任务结合起来。当您想解除任务与联系人的关联时,我也看到这很复杂,因为您必须将其从联系人移动到公司 Company.Tasks
中列表,每个联系人都有一个与其关联的任务的 id 值列表。除了必须手动获取 id 值并且必须创建 Task
的子列表之外,这似乎是一个不错的方法。联系人的实体。 最佳答案
使用非规范化引用:
http://ravendb.net/faq/denormalized-references
本质上你有一个 DenormalizedReference 类:
public class DenormalizedReference<T> where T : INamedDocument
{
public string Id { get; set; }
public string Name { get; set; }
public static implicit operator DenormalizedReference<T> (T doc)
{
return new DenormalizedReference<T>
{
Id = doc.Id,
Name = doc.Name
}
}
}
public class Company : INamedDocument
{
public string Name{get;set;}
public int Id { get; set; }
public IList<DenormalizedReference<Contact>> Contacts { get; set; }
public IList<DenormalizedReference<Task>> Tasks { get; set; }
}
public class Contact : INamedDocument
{
public string Name{get;set;}
public int Id { get; set; }
public DenormalizedReference<Company> Company { get; set; }
public IList<DenormalizedReference<Task>> Tasks { get; set; }
}
public class Task : INamedDocument
{
public string Name{get;set;}
public int Id { get; set; }
public DenormalizedReference<Company> Company { get; set; }
public DenormalizedReference<Contact> Contact { get; set; }
}
var task = new Task{
Company = myCompany,
Contact = myContact
};
public class Tasks_Hydrated : AbstractIndexCreationTask<Task>
{
public Tasks_Hydrated()
{
Map = docs => from doc in docs
select new
{
doc.Name
};
TransformResults = (db, docs) => from doc in docs
let Company = db.Load<Company>(doc.Company.Id)
let Contact = db.Load<Contact>(doc.Contact.Id)
select new
{
Contact,
Company,
doc.Id,
doc.Name
};
}
}
var tasks = from c in _session.Query<Projections.Task, Tasks_Hydrated>()
where c.Name == "taskmaster"
select c;
关于data-modeling - 如何在 RavenDB 等面向文档的数据库系统中对分层和关系数据进行建模?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6285711/
NoSQL 是 RDBMS 的替代品,可以很好地处理包含大量数据的简单数据模型。 MongoDB、Google 的 BigTable、Dojo 的 Persevere、Amazon 的 Dynamo、
我是一名优秀的程序员,十分优秀!