在我看来,Room上的许多指南(以及其他ORM)专注于创建Room实体,并从此开始将这些作为其域模型使用。但是,如果我的模型需要其实际结构来执行某些业务逻辑呢?
例如,参加以下课程:
class Report(var id: Long, var patient: Patient, var surgery: Surgery) {
var minimumAllowableBloodLoss: Double = 0.0
get() = ((this.patient.hemoglobin - this.patient.minHemoglobin) / this.patient.hemoglobin) * this.patient.bloodVolume * this.patient.weight
private set
var hourlyDiuresis: Double = 0.0
get() = this.patient.diuresisOutput / this.surgery.duration
private set
var urineOutput: Double = 0.0
get() = this.hourlyDiuresis / this.patient.weight
private set
var intakeSupply: Double = 0.0
get() = this.patient.totalIntake / this.patient.weight
private set
var finalFluidBalance: Double = 0.0
get() = this.patient.totalIntake - this.patient.totalOutput
private set
}
如果我把这个类变成了Room实体,我就不得不将我的对象引用改为外键,基本上不可能从这个类中进行我需要的计算。
当然,我的第一直觉是完全废弃这个想法并创建一个表示对象,我相信它也被称为一个持久性模型":
@Entity
data class ReportRow(
var patientId: Long, var surgeryId: Long) {
@PrimaryKey(autoGenerate = true)
var id: Int = 0
}
但这也意味着我必须创建从持久性模型到域的转换方法,反之亦然。
这让我相信也许我完全错过了一些东西,或者我没有正确使用这些工具,这些案例有更好的选择吗?
答案 0 :(得分:0)
它们应该分开。
来自docs:
实体:表示数据库中的表。
尽管文献中经常将实体称为“数据模型”,但许多示例简化了设计并假定实体=业务模型。
但是,这种设计很可能违反Single Responsibility Principle,一旦您希望将数据保留在云中就可能很快崩溃,因为在云中可以使用某些非SQL解决方案来保留数据。