Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 域对象中的关系引用-是否包含Id?_Mongodb_Oop_Relational Database_Non Relational Database_Database - Fatal编程技术网

Mongodb 域对象中的关系引用-是否包含Id?

Mongodb 域对象中的关系引用-是否包含Id?,mongodb,oop,relational-database,non-relational-database,database,Mongodb,Oop,Relational Database,Non Relational Database,Database,我想知道为我的项目设计域对象的最佳方法是什么 域对象应该不了解ORM/框架,甚至数据库技术(MySQL、MSSQL甚至Mongo) 接下来我要问的问题是,假设我有两个目标,Post和Comment 这是Post对象的代码: class Post { public int Id { get; set; } public string Title { get; set; } public string Content { get; set; } public ILis

我想知道为我的项目设计域对象的最佳方法是什么

域对象应该不了解ORM/框架,甚至数据库技术(MySQL、MSSQL甚至Mongo)

接下来我要问的问题是,假设我有两个目标,Post和Comment

这是Post对象的代码:

class Post {
    public int Id { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }
    public IList<Comment> Comments { get; set; }
}
包含关系对象的Id还是仅包含其域对象的Id是一种好的做法

另一个问题是没有像mongodb这样的sql数据库。 如果我将数据存储在mongodb中,Comment对象将引用哪个Post对象? 在mongodb中,帖子和评论之间没有关系,任何帖子都包含评论列表,但评论本身并不知道它们所属的帖子。 那么,使这些域类与基于Sql的数据库和NoSql数据库兼容的最佳方法是什么呢

谢谢你

面向对象设计 您设计了
Post
Comment
类,使它们相互引用。除非绝对必要,否则我会尽量避免这种紧密耦合,但它肯定会使
Comment.PostId
过时,您可以从
Comment
中调用
Post.Id

此外,您的域对象可能应该尝试保护它们的不变量。您现在拥有的只是属性包(即使使用公共setter),而不是域对象,因此目前它们与用于持久化的对象相比没有任何有意义的优势

因此,如果您想创建一个域模型,可以问自己以下问题:

  • 在我正在构建的系统中,演员可以用帖子做什么
  • 参与者可以检索评论中的哪些数据
然后以支持业务案例的方式对域对象进行建模。例如,如果应用程序的用户被禁止更改文章的标题,则应该从
post.title
中删除setter

可能会为您提供更多关于域对象和简单属性包(又名POCO)之间区别的信息,即使答案是在域驱动设计的上下文中

文档数据库持久性 要将这些对象存储在面向文档的数据库中,基本上有两种选择:

  • 将它们作为单独的文档存储,并相互引用
  • 将评论作为其帖子的一部分存储在帖子文档中

这两种方法都是有效的,您必须为您的应用程序做出决定。但是请注意,文档边界也是一致性边界,因此,如果您需要对帖子及其评论执行原子操作,您唯一的选择就是将它们放在同一文档中。

您绝对应该将其包括在内。如果您想获取注释列表,但不想获取每个注释的Post对象,但仍然需要PostID,该怎么办?

您想在设计中使用DDD吗?您添加了DDD标记,但问题似乎与DDD无关。请澄清。尽量避免在一个问题中出现那么多问题。问题的第一部分(ID/relations)与第二部分(mongoDB)无关,因此如果你问多个单独的问题会更好。@theDmi这是一个错误,我试图为域对象找到一个标记。。。我理解这些问题可能看起来不相关,但这两个问题都围绕着设计我的域对象的最佳实践是什么。“如果是好的实践吗?”,很抱歉告诉你这一点,但欢迎使用NoSQL,因此对你最有效的就是最好的,而不是要遵循的标准。另一方面,如果您试图做一些能够很好地映射到关系域和更多文档/对象存储域的事情,那么祝您好运,但至少从关系的角度来看,您可能需要两端的映射。“良好实践”是指做最适合您的应用程序的事情。理想情况下,您的对象应该与存储分离,但整个主题有点过于宽泛。谢谢您的评论。我不明白你说我的对象不是域对象是什么意思,你能解释一下吗?
class Comment {
    public int Id { get; set; }
    public string Content { get; set; }
    public Post Post { get; set; }

    public int PostId { get; set; } // Should i include it?
}