编辑:伟大的早期回复让我意识到,我的问题与权衡相比,更有用的是@ Leo的变化。
我正在开发Code-First EF中的数据模型,并且对可能非常基础的东西感到不熟悉。
鉴于Team和Player类,Team有N个玩家,可以设计数据模型
1)将玩家作为成员子对象:
class Team
{
int Id;
ICollection<Player> Players;
}
或 2)(被拒绝没有真正的好处)我们可以将参考ID传递给玩家
class Team
{
int Id;
ICollection<int> PlayerIds;
}
或 3) 使用外键ID实现模型独立性
class Team
{
int Id;
}
class Player
{
int Id;
int TeamId;
}
我可以看到第3种方法有一些明显的好处,如下面@Leo所示。因此,或许我的问题最好是措辞,在这一点上,“在什么情况下,人们可能更倾向于使用变体1”?
答案 0 :(得分:3)
嗯,我想你是对的,你找不到很多资源来概述你应该如何设计数据层和/或模型。实际上,您将找到的资源最有可能描绘出不同的方式,并可能建议您应该(或不应该)做什么。但是,我发现这个主题非常主观,你不应该把它与背景区分开来,我的意思是,只有你应该知道哪种方法最适合你的情况,因为你是最了解你的系统的人#39;内在函数。这两种方法对我来说都很好,你应该总是努力保持子系统之间的松散耦合。基本上,这个映射...
class Team
{
int Id;
ICollection<Player> Players;
}
让团队依赖于玩家,这是很好的IF(并且只有在它)是一个永远不会改变的要求。此外,如果玩家将永远属于一个且只有一个团队,那么您可以采取另一种方法,让您的团队模型/实体依赖免费...
class Team
{
int Id;
string TeamName;
}
class Player
{
int Id;
int TeamId;
}
数据库查询不应该成为一个问题,你的演示文稿和模型层应该试图从关系中抽象出来,如果你不能......说,你需要展示/展示一个团队及其参与者然后你最有可能需要2个数据库查询(如果你不想使用连接并清理重复的字段......团队,在这种情况下)并且我没有看到做出2个单独的数据库查询有什么问题。
我猜方法1使耦合变得更紧,你应该总是避免它,想象一下如果你有机会获得Player
类的名字,你必须做出很多改变整个系统。此外,如果您暴露API,您的客户可能会更糟糕。但是,正如我所说,这一切都取决于你的系统的核心要求......如果这些是核心(难以改变)的要求,那么你就不应该担心它。
&#34;在哪些情况下,人们可能更喜欢使用变体1&#34;?
同样,这一切都与需求有关,如果您的要求规定团队和玩家之间存在关系,那么只要您可以在两个实体之间建立关系,所有方法都可以。
答案 1 :(得分:1)
我认为,耦合的微小减少的权衡是复杂性的增加。事实上,我怀疑你维护或增加整个应用程序中的耦合量,因为你只是将获取和操作这些对象的责任转移到中间类 - 或者更糟糕的是,你开始将数据访问逻辑合并到你的模型。
答案 2 :(得分:1)
在我看来,答案是:既不是。
在实体框架中,您可以选择两种类型的关联
独立关联,您只能引用另一个对象。一个例子是
class Player
{
int Id;
Team Team;
}
外键关联,其中有一个引用和一个原始外键值:
class Player
{
int Id;
[ForeignKey("Team")]
int TeamId;
Team Team;
}
您的备选方案2)不是一个选项,因为您无法在数据库字段中存储整数列表。此外,你需要什么?没有球员,他们就毫无意义。
来自DDD背景的人总是不赞成外键关联,因为域模型不应该有任何商店实现的概念。但是,当您使用EF时,这是推荐的方法。原因如下:
如果要存储新播放器,可以设置Team
或TeamId
属性。现在,如果您碰巧有Team
,这无所谓。但是,在许多情况下,您只会拥有TeamId
(例如,因为它是从下拉列表中选择的)。对于独立关联,您必须首先进行数据库往返以获取Team
,然后设置属性。只需设置Id
就会更简单,效果更好。
如果您实际上只存储TeamId
,那么您没有关联,因此不能将其列为关联的第三种替代方案。而且这不是一个可行的选择。您将始终以某种方式加入以获取关联的Team
。但是,如果您想在一次运行中存储新的Team
和新的Player
,该怎么办?您必须首先存储Team
,获取其分配的Id
,设置Player
的{{1}}并存储TeamId
,所有这些都包含在Player
。使用FK关联,您只需创建对象,设置TransactionScope
和EF数字,以便插入对象并为您设置FK值。
所以我想说的是,在优化作为实体框架概念模型的类模型时,DDD原则如松散耦合,关注点分离最好在后台发挥作用。这个类模型不是一个域模型,它是一个数据层first and foremost。
答案 3 :(得分:0)
除非Id
与概念模型相关,否则我不会将其包含在模型中。它似乎是数据库实现的细节,而不是模型的真实部分。
一支球队有球员。它没有玩家ID。
您还应该考虑团队Id
是否与您的模型相关。如果你正在模拟(美国)足球比赛,那么球员的球衣上的数字可能很重要。但是你不会显示玩家的员工ID。