在静态语言中分离和合并由数据库表组成的对象

Separating vs merging objects made from database tables in static languages

本文关键字:数据库 对象 合并 语言 静态 分离      更新时间:2023-10-16

考虑一下,在数据库中有一个名为users的表和一个称为wallets的表。用户拥有0个、1个或多个钱包。这种关系是一对多的,这意味着钱包有一个指向用户的外键。

现在的问题是:当为一个人构建结构或类时,我看到了两种可能性:

1) 用户没有钱包的迹象。有一个函数将用户作为参数,并获取一个钱包数组。

2) 用户有一个成员,它是一个包含钱包的数组,在创建对象/结构时会提取钱包。

我认为第一种方法可能更好,因为它更模块化——在第二种方法中,用户依赖钱包,即使用户没有钱包。尽管如此,我不确定哪种方法更好,所以我正在寻找两种方法的比较。

在应用程序级别上,您可能有这样的用户类型(Go表示法):

type User interface {
    Wallets() []Wallet
}

在下面,有一个数据库,在您的例子中是SQL。通过查看您的应用程序,这应该是显而易见的。

以接口契约的形式对依赖关系做出超出其保证范围的假设,会不可逆转地耦合组件。

这意味着,如果你根据数据库的模式对应用程序进行建模,你就错了,因为你的整个应用程序现在都与所述数据库紧密耦合,对其中任何部分的任何更改都将产生巨大的、不可预测的影响。

一个常见的解决方案是使用一个所谓的ORM层,它位于数据库驱动程序和实体模型之间。它将处理以下内容:

  • 钱包应该如何提取以及何时提取
  • 钱包的信息存储在数据库的哪个位置
  • 删除用户时,钱包是否也应该删除

除其他外。

PS:这个答案既适用于静态类型语言,也适用于动态类型语言。