我应该从我的域模型中删除FK吗?

时间:2009-04-03 04:53:11

标签: nhibernate domain-driven-design

我正在开始一个新项目并计划使用nhibernate。我正在努力解决是否应该通过省略外键来保持我的域模型清除持久性信息。我一直觉得我的某些“模型”并不是真正必要的,而且性能将成为一个问题。例如:

在我的数据库中,我有下表:

Posting
    Id
    StatusId
    ...

与此表有FK关系:

PostingStatus
    Id
    Name

在我的模型中,我定义了两个类:

class Posting
{
    virtual int Id { get; set; }
    virtual PostingStatus Status { get; set; }
    // ..
}

class PostingStatus
{
    virtual int Id { get; set; }
    virtual string Name { get; set; }
}

PostingStatus是否属于我的模型?如果我提前知道FK,比如在提交后更新帖子,那么让nhibernate获取PostingStatus实例而不仅仅是设置FK不是一个非常重的性能(或者只是无用的工作)吗? / p>

我很确定之前已经讨论过这个问题,但我一直在寻找具有重要意义的讨论部分。关于这个问题的想法或资源将不胜感激。

3 个答案:

答案 0 :(得分:3)

如果域模型要求强制执行关系,则需要外键。

在实际出现性能问题之前,请不要担心性能。

答案 1 :(得分:1)

米奇说的是什么。 NHibernate由那些彻底思考这些问题的人组成。做正确的事情,担心在遇到问题时进行优化。

(无论如何,nhibernate可能会从缓存中获取发布信息。)

此外,根据您的设置方式,nhibernate可能需要FK约束才能将数据库映射到您的对象。

如果PostingStatus是一个域实体,你应该保留它。如果不是,请将其删除,不要试图过早优化。

答案 2 :(得分:1)

在这种非常特殊的情况下,您实际上可能会将实体PostingStatus替换为Enum。如果正确指定枚举值,则可以映射到表并由FK强制执行。

NH并不只是“缓存”东西。我建议在这种情况下使用二级缓存和延迟加载PostingStatus。