Java 数据建模和使用DAO模式访问数据
我正在用Java创建一个非常简单的应用程序,将问题存储在嵌入式Derby数据库中。我决定使用DAO模式访问数据库中的数据。我不能在这个项目中使用ORM 一个问题将包含我通常使用关系数据库中的多对一关系建模的数据。该数据的一个例子是: 一个问题将有一个类别。一个类别将有多个问题。 一道题的分数为1000分、2000分或3000分。分数会有很多问题。 考虑到上述内容,我将创建三个表,括号表示列: 问题id,问题,分数id,类别id 分数id,分数 类别id,类别 我的第一个问题是: 像我上面建议的那样,在三个表格中对我的数据进行建模,这是一种糟糕的做法/错误的做法吗?将分数和类别存储在单独的表中有什么好处吗?还是将它们合并到问题表中更好?对于我来说,链接到具有单列(id除外)的表的多对一关系似乎是多余的,因为不存储引用分数/类别表的id,我们可以简单地存储类别/分数的值,因为类别/分数表不存储任何附加信息 我的第二个问题是: 如果跨单独的表建模数据是正确的方法,那么如何使用DAO模式访问数据?我的困惑来自以下几点: 我将创建一个DAO来填充一个问题模型对象,该对象看起来有点像这样:Java 数据建模和使用DAO模式访问数据,java,relational-database,data-modeling,dao,Java,Relational Database,Data Modeling,Dao,我正在用Java创建一个非常简单的应用程序,将问题存储在嵌入式Derby数据库中。我决定使用DAO模式访问数据库中的数据。我不能在这个项目中使用ORM 一个问题将包含我通常使用关系数据库中的多对一关系建模的数据。该数据的一个例子是: 一个问题将有一个类别。一个类别将有多个问题。 一道题的分数为1000分、2000分或3000分。分数会有很多问题。 考虑到上述内容,我将创建三个表,括号表示列: 问题id,问题,分数id,类别id 分数id,分数 类别id,类别 我的第一个问题是: 像我上面建议的那
public class Question {
String question;
String category;
Integer score;
}
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接口的具体实现,如下所示:
public class Question {
String question;
String category;
Integer score;
}
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是没有意义的。。如果我这样做了,我将如何填充我的模型
像我上面建议的那样,在三个表格中对我的数据进行建模,这是一种糟糕的做法/错误的做法吗?将分数和类别存储在单独的表中有什么好处吗
这是一个讨论的问题。为了避免得分,我宁愿把这些信息和问题联系在一起。另一方面,类别将在单独的表格中,因为更多的问题将共享同一类别,因此这是一个完美的选择
每个DAO对象不应该只与数据库中的一个表有关吗
是的,DAO,一个对象应该与一个数据源有关——正如您所说的。我当然会尽量避免任何ComplexDao,因为这些类往往会变得更复杂,并且方法的数量会随着时间的推移而增加
存在一个服务层来将这些结果组合在一起,并使用完全相同的服务向控制器提供输出
像我上面建议的那样,在三个表格中对我的数据进行建模,这是一种糟糕的做法/错误的做法吗?将分数和类别存储在单独的表中有什么好处吗
这是一个讨论的问题。为了避免得分,我宁愿把这些信息和问题联系在一起。另一方面,类别将在单独的表格中,因为更多的问题将共享同一类别,因此这是一个完美的选择
每个DAO对象不应该只与数据库中的一个表有关吗
是的,DAO,一个对象应该与一个数据源有关——正如您所说的。我当然会尽量避免任何ComplexDao,因为这些类往往会变得更复杂,并且方法的数量会随着时间的推移而增加
存在一个服务层来将这些结果组合在一起,并使用完全相同的服务向控制器提供输出。跨单独的表对数据进行建模是正确的方法,但不一定是最好的方法 分离表有助于数据库规范化: 有人可能认为DAO模式意味着每个DAO对象都与单个实体有关。与ORMs的工作方式类似,实体可以很容易地引用其他实体 查询问题时,还可以返回问题对象内的类别和分数id,并强制库用户使用这些id值及其各自的DAOs分数和类别来获取分数值和类别值 所以我相信你所做的一切似乎都很好
希望这有助于跨单独的表建模数据是正确的方法,但不一定是最好的方法 分离表有助于数据库规范化: 有人可能认为DAO模式意味着每个DAO对象都与单个实体有关。 与ORMs的工作方式类似,实体可以很容易地引用其他实体 查询问题时,还可以返回问题对象内的类别和分数id,并强制库用户使用这些id值及其各自的DAOs分数和类别来获取分数值和类别值 所以我相信你所做的一切似乎都很好 希望这有帮助