我正在用Java创建一个非常简单的应用程序,它将问题存储在嵌入式Derby数据库中。我已经决定使用DAO模式来访问数据库中的数据。我不能为此项目使用ORM。
一个问题将包含我通常使用关系数据库中多对一关系建模的数据。此数据的示例为:
考虑到以上几点,我将创建三个表(方括号表示列):
我的第一个问题是:
像上面我建议的那样,在三个表之间对数据建模会是错误的做法/错误的处理方式吗?将分数和类别存储在单独的表中有什么好处?还是将它们合并到Question表中会更好?对我来说,与具有单列的表链接的多对一关系(id除外)对我来说似乎是多余的,因为我们可以存储类别/分数的值,而不是存储引用Score / Category表的ID (由于category / score表不存储任何其他信息)。
我的第二个问题是:
如果在不同的表之间对数据建模是正确的方法,那么我将如何使用DAO模式访问数据?我的困惑来自以下方面:
我将创建一个DAO来填充看起来像这样的Question
模型对象:
public class Question {
String question;
String category;
Integer score;
}
我将像这样创建DAO接口的具体实现:
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根本没有意义..(如果这样做,我将如何填充模型?)
答案 0 :(得分:1)
像上面我建议的那样,在三个表之间对数据建模会是错误的做法/错误的处理方式吗?将分数和类别存储在单独的表中有什么好处??
这是讨论的问题。对于score
,我宁愿将此信息附加在question
上。另一方面,category
将位于单独的表中,因为更多的问题将共享同一类别,因此这很合理。
不是每个DAO对象仅与数据库中的单个表有关吗?
是的,DAO,对象应该与单一数据源有关-正如您所说的。我肯定会尝试避免使用任何ComplexDao
,因为这些类会变得越来越复杂,并且方法的数量会随着时间的推移而增加。
存在一个服务层,将这些结果组合在一起,并使用相同的服务将输出提供给控制器。
答案 1 :(得分:1)
跨单独的表对数据建模是一种正确的方法(不一定是最好的方法)。
分隔表有助于数据库规范化:https://en.wikipedia.org/wiki/Database_normalization。
有人可能会说DAO模式意味着每个DAO对象都与单个实体有关。与ORM的工作方式类似,一个实体可以轻松引用其他实体。
当您查询问题时,您也可以只返回问题对象内的类别和分数ID,并强制库用户使用这些ID值及其各自的DAO(分数)来获取分数值和类别值(懒惰获取)。和类别)。
所以我相信你在做什么看起来不错
希望这会有所帮助