0

所以,我的数据库现在看起来像:

Comment -> Commentable 

Commentable -> News
Commentable -> Files
Commentable -> Photo

这意味着,当我添加新实体(文件或照片)时,我必须添加新的 Commentable 并将此值插入实体。

这方面的最佳做法是什么?我应该覆盖实体的创建功能,还是将其放入存储库添加功能?

表的结构看起来像这样,因为我不需要为每个实体创建自己的评论表。

编辑:我的表架构如下:Branko Dimitrijevic 帖子中的一张表与多张表

当我想添加新文件或事件时——首先,我必须生成新的“可评论”行,然后才添加关联我的实体。

所以,我的问题是,我必须把这个逻辑放在哪里,或者如何在最正确的实践中做到这一点?

谢谢。

4

3 回答 3

1

仔细考虑照片、新闻和文件表的设计。当我发布我的第一个 Stackoverflow 问题时,我正在考虑一个类似的问题:数据库设计 - 文章、博客文章、照片、故事

我意识到文章、照片、视频、文档和博客帖子都共享一些公共字段,如作者、发布日期、标题、描述、关键字等。所以我创建了一个表的超类型/子类型层次结构,使用 EF 的类型继承特性对其进行建模。然后评论只有一个超类型表(我命名为出版物)的外键。在大多数情况下,这对我来说效果很好。

请注意,如果您使用 EF 的继承:有 2 个变体:每个类型的表 (TPT) 和每个层次结构的表 (TPH),每个都有问题:

TPT:为公共字段提供一个超级表,为每个子类型的属性提供一个单独的数据库表。当您查询超类型时,这会出现性能问题(有时很严重)。一种解决方法是创建一个视图以将超类型表引用为不同的实体(这就是我所做的),但这比您想要的要复杂一些

TPH:没有性能问题,但该解决方案本质上将层次结构扁平化为一张表。我发现,DBA 和 DB 纯粹主义者真的不喜欢你这样做。

于 2012-10-17T19:36:05.860 回答
0

你不需要这样做。如果您有正确的模型结构,EF 会这样做。

public class Comment
{
  public int ID { set;get;}  
  public string Author { set;get;}
  public IEnumrable<CommentContent> CommentContents
}
public class CommentContent
{
  public int ID { set;get;}  
  public string Photo { set;get;}
  public string News{ set;get;}
  public int CommentID { set;get;}
}

现在为您的模型设置属性(包括子表)并执行 SaveChanges,EF 将负责在子表上设置父 ID。

var model=new Comment();
model.Author="Scott";
model.CommentContents.Add(new CommentContent
                                 { Photo="abc.jpg", News="Some content"});
model.CommentContents.Add(new CommentContent
                                 { Photo="abc3.jpg", News="Some content2"});
yourDbContext.Comments.Add(model);
yourDbContext.SaveChanges();
于 2012-10-17T18:59:35.123 回答
0

了解您要实现的目标的“官方”术语可能会有所帮助,因此您可以进行进一步的研究。它是多态关联。请注意,它通常被认为是一种反模式。我曾经在 StackOverflow 上问过一个关于它们的问题,其中的第一张图片可能是您实现它的方式:

在此处输入图像描述

这是根据 Bill Karwin 关于如何实现这个反模式的建议,如果你仍然使用它(就像我自己做的那样,对我来说,这只是一个模式)。

事实上,这就像 Faust 的 TPT 解决方案(如果它适合您,您应该接受它作为答案),特别是如果您使用三个类共有的所有属性扩展基表。

在这种情况下,我更愿意在存储库Add函数中处理它,其中每个函数都会为您添加的实体创建评论对象。

于 2012-10-18T08:25:54.643 回答