gpt4 book ai didi

java - 使用 DAO 模式对数据进行建模并访问它

转载 作者:行者123 更新时间:2023-11-30 02:03:55 27 4
gpt4 key购买 nike

我正在使用 Java 创建一个非常简单的应用程序,它将在嵌入式 Derby 数据库中存储问题。我决定使用 DAO 模式来访问数据库中的数据。我无法在这个项目中使用 ORM。

问题将包含我通常使用关系数据库中的多对一关系进行建模的数据。此数据的示例如下:

  • 一个问题将有一个类别。一个类别会有多个问题。
  • 一个问题的分数将为 1000、2000 或 3000。一个分数将包含许多问题。

考虑到上述内容,我将创建三个表(括号表示列):

  • 问题(id、问题、scoreId、categoryId)
  • 分数(id,分数)
  • 类别(id、类别)

我的第一个问题是:

像我上面建议的那样,跨三个表对我的数据进行建模是否是不好的做法/错误的方法?将分数和类别存储在单独的表中有什么好处吗?或者将它们合并到问题表中会更好吗?链接到具有单列(id 除外)的表的多对一关系对我来说似乎是多余的,因为我们可以简单地存储类别/分数的值,而不是存储引用分数/类别表的 id (因为类别/分数表不存储任何附加信息)。

我的第二个问题是:

如果跨不同表对数据进行建模是正确的方法,那么我将如何使用 DAO 模式访问数据?我的困惑来自于以下几点:

我将创建一个 DAO 来填充 Question 模型对象,该对象看起来有点像这样:

public class Question {
String question;
String category;
Integer score;
}

我将创建 DAO 接口(interface)的具体实现,如下所示:

public class QuestionAccessObject implements QuestionDao {
private static final String TABLE_1 = "QUESTION";
private static final String TABLE_2 = "SCORE";
private static final String TABLE_3 = "CATEGORY";

@Override
public List<Question> getAllQuestions() {
List<Question> questions = new ArrayList<>();

//Run a query with joins across the three tables and iterate over the result to populate the list
return questions;
}
}

每个 DAO 对象不应该只关心数据库中的一个表吗?我上面列出的方法似乎不是解决此问题的最正确方法。单独的表也会使将数据插入数据库变得非常困惑(我不明白如何使用 DAO 模式和多个表采取干净的方法)。为分数和类别表创建 DAO 并没有真正意义......(如果我这样做,我将如何填充我的模型?)

最佳答案

Would modelling my data across three tables like I suggest above be bad practice/the wrong way to go about this? Is there any benefit in storing score and category in separate tables....?

这是一个值得讨论的问题。如果是分数,我宁愿将此信息与问题放在一起。另一方面,类别 将位于单独的表中,因为更多问题将共享同一类别,因此这是完全合理的。

Shouldn't each DAO object only be concerned with a single table in the database?

是的,DAO,一个对象应该关注单一数据源——正如你所说。我当然会尽量避免使用任何ComplexDao,因为这些类往往会变得更加复杂,并且方法的数量会随着时间的推移而增加。

存在一个服务层将这些结果组合在一起,并使用相同的服务向 Controller 提供输出。

关于java - 使用 DAO 模式对数据进行建模并访问它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51895026/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com