2

我正在使用 servicestack,并且我计划将 ormlite 用于数据访问层。我有这些表(SQL Server 2005)

Table ITEM
ID PK
...

Table SUBITEM1
ID PK FK -> ITEM(ID)
...

Table SUBITEM2
ID PK FK -> ITEM(ID)
...

Table POST
ID PK
...

Table COMMENT
ID PK
...

Table DOWNLOAD
ID PK
...

Table POST_COMMENT
ID PK
POST_ID FK -> POST(ID)
COMMENT_ID FK -> COMMENT(ID)

Table DOWNLOAD_COMMENT
ID PK
DOWNLOAD_ID FK -> DOWNLOAD(ID)
COMMENT_ID FK -> COMMENT(ID)

我为每个表创建了一个类,并使用注释(自动增量、引用等)映射它们。

我决定为每个“实体”(项目、帖子、评论、下载)创建一个存储库。每个存储库都包含基本的 CRUD 逻辑,

例如。1 CommentRepository 有一个 Save(Comment comment, Object relationship),它执行 db.Insert(comment, relationship),其中关系是 PostComment 或 DownloadComment。

例如。2 PostRepository 有一个 Save(Post p) 执行插入到 POST 中。

我不确定这个解决方案,因为存储库接口不同,我不能进行多态查询。

你能提供任何建议来改善我的 DAL 吗?

感谢您的关注。

4

1 回答 1

10

我不喜欢强制人工抽象,所以我不喜欢从每个实体的存储库开始,因为它只会导致不必要的代码膨胀。我喜欢从只为所有实体封装所有数据访问的 1 个存储库开始,并在它变得太大时自然地重构。

我对您的域了解得不够多,不知道最好的 RDBMS 布局是什么,但我也想尽可能避免创建不必要的表,并且会寻找 blob 非聚合根数据,例如,如果 SubItem 只能应用而不是在其父项的上下文之外有意义,那么我只需将它保存几个表,例如:

class Item {
   int Id; //PK, AutoIncr
   List<SubItem> SubItem;
}

而不是单独的 Many : Many 表,我只会在单个 Comment 表上维护它,例如:

class Comment {
    int Id; //PK, AutoIncr
    string CommentType; //i.e. Post or Download
    int RefId;
    string Comment;
}

因此,我的存储库将模仿完成 Web 请求所需的数据访问模式,例如:

class BlogRepository {
    void AddCommentToPost(int postId, Comment comment);
    void AddCommentToDownload(int downloadId, Comment comment);
}
于 2012-10-04T18:28:19.417 回答