英文:
Is correct to have an aggregate with fields different than database object?
问题
我正在尝试应用领域驱动设计(DDD),但有一些疑问。我正在阅读斯科特·米勒特的DDD书,刚刚读完了聚合章节。
想象一个简单的领域模型,类似这样:
class Candidate
val id: CandidateId
val name: Name
val musicStylesPreferences: List<MusicStyle>
val sportPreferences: List<Sport>
val smoking: Boolean
enum MusicStylePreference
ROCK, METAL, POP, HIPHOP
其他对象是这样的。
如果我们考虑持久化“候选人”(Candidate),我的方法如下:
*DatabaseObject*
CandidateVO
val id: String
val name: String
MusicStylePreferenceVO
val candidateId: String
val StyleName: String
当我将“候选人”对象持久化到数据库中时,我会将其持久化到适当的表格中,当我填充聚合时,我会查询这些表格。
我不确定这种方法是否正确,我也在考虑,也许像“MusicStylePreference”、“Smoking”等对象不需要保持一致性和事务性(这是聚合的一些优势),可以放在“候选人”聚合之外。
你认为呢?
我感谢任何回答。谢谢
英文:
I'm trying to apply DDD and I have some doubts. I'm reading Scott Millet DDD book and I've just read Aggregates chapters.
Imagine a simple domain model like this:
class Candidate
val id: CandidateId
val name:Name
val musicStylesPreferences: List<MusicStyle>
val sportPreferences: List<Sport>
val smoking: Boolean
enum MusicStylePreference
ROCK, METAL, POP, HIPHOP
The other objects are like this.
If we think about persisting the Candidate
, my approach is like this:
*DatabaseObject*
CandidateVO
val id: String
val name: String
MusicStylePreferenceVO
val candidateId: String
val StyleName: String
When I persist the Candidate
object in database I will persist in the appropriate table and when I hydrate the aggregate, I will query the tables.
I'm not sure if this approach is correct, I'm also thinking that maybe the objects like MusicStylePreference
, Smoking
etc ... doesn't need to be consistent and transactional (some of the advantages of aggregates) and can be outside of the aggregate Candidate
.
What do you think?
I appreciate any answer. Thanks
答案1
得分: 4
这是正确的,甚至是必要的。聚合应该建模普遍语言,而数据库字段名称涉及持久性并具有其他独立的目标和要求。
一个刻意构造的例子:数据库可能将全名保存为“Firstname”、“LastName”,但聚合只有一个字符串FullName,这是值的串联。它不关心它们如何被持久化,甚至不关心它们被持久化在哪里。
英文:
It's correct and even necessary. The Aggregate should model the ubiquitous language while the database field names are about persistence and have other separate goals and requirements.
A contrived example; The database might save a fullname as "Firstname", "LastName" but the aggregate just has a string.FullName that's a concatenation of the values. It doesn't care how they are persisted or even where.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论