理解如何建模 UML Class/Database

Understanding how to model UML Class/Database

我对设计一个与数据库集成的客户端软件感到困惑,该软件应该是 class 的成员变量,或者只是对数据库的查询。让我用一个简单的例子来具体说明:

如果我有一个 Student class,它有一个 Student 对象的“朋友”列表。我的软件设计是否应该有一个 ArrayList<Student> 作为 Student class 的成员变量,或者数据库应该处理关系本身而 Student class 不不考虑那些“朋友”?在这种情况下,正确的 UML class-图应该如何?

您需要 Student 和关系数据库和对象模型中的朋友之间的 one-to-many 关系。

这个问题比你想象的要广泛,因为有很多方法可以解决它。这里有一些初步想法:

让我们从快速 class 图表开始。同学之间的友谊是many-to-many的联想。

在数据库中,many-to-many 关联通常是 implemented using an association table。因此,您将有两个 table:STUDENTS 和 FRIENDSHIPS 以及成对的好友 ID:

要从数据库加载 Student 对象,您需要读取 STUDENTS 行中的数据并使用它来初始化您的对象。为了友谊,你必须阅读相关的 FRIENDSHIPS 行。

但是如何在应用程序中使用这些table?

  • 第一种可能性是加载每个 Student 朋友并将其插入 ArrayList<Student>。但是每个加载的学生就像第一个学生,并且可以有自己的朋友,您也必须加载!你最终会加载很多学生,如果不是全部,只是为了找到你感兴趣的一个。
  • 第二种可能性是使用 ArrayList<StudentId> 而不是 ArrayList<Student> 并填充它。然后你会及时加载朋友,只有在需要的时候。但这需要对您的应用程序进行一些更重要的更改。
  • 第三种可能性是不暴露ArrayList。不泄露内部总是一个好主意。而是使用 getter。因此,只有在调用 student.getFriends() 时才加载朋友。这是一种方便的方法,因为您可以随意使用一组朋友,但要避免陷入朋友的朋友的递归加载中。

在所有情况下,您可能对使用 repository 对象获取个人或学生集合并封装数据库处理感兴趣。

建议:如前所述,还有更多选择,存储库是一种方法,但也有活动记录、table 网关和其他方法。要获得完整的概述,您可能对 Martin Fowler 的书感兴趣 Patterns of Enterprise Application Architecture.