理解如何建模 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.
我对设计一个与数据库集成的客户端软件感到困惑,该软件应该是 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.