建模数据并使用DAO模式进行访问

时间:2018-08-17 12:01:59

标签: java relational-database data-modeling dao

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

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

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

考虑到以上几点,我将创建三个表(方括号表示列):

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

我的第一个问题是:

像上面我建议的那样,在三个表之间对数据建模会是错误的做法/错误的处理方式吗?将分数和类别存储在单独的表中有什么好处?还是将它们合并到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根本没有意义..(如果这样做,我将如何填充模型?)

2 个答案:

答案 0 :(得分:1)

  

像上面我建议的那样,在三个表之间对数据建模会是错误的做法/错误的处理方式吗?将分数和类别存储在单独的表中有什么好处??

这是讨论的问题。对于score,我宁愿将此信息附加在question上。另一方面,category将位于单独的表中,因为更多的问题将共享同一类别,因此这很合理。

  

不是每个DAO对象仅与数据库中的单个表有关吗?

是的,DAO,对象应该与单一数据源有关-正如您所说的。我肯定会尝试避免使用任何ComplexDao,因为这些类会变得越来越复杂,并且方法的数量会随着时间的推移而增加。

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

答案 1 :(得分:1)

跨单独的表对数据建模是一种正确的方法(不一定是最好的方法)。

分隔表有助于数据库规范化:https://en.wikipedia.org/wiki/Database_normalization

有人可能会说DAO模式意味着每个DAO对象都与单个实体有关。与ORM的工作方式类似,一个实体可以轻松引用其他实体。

当您查询问题时,您也可以只返回问题对象内的类别和分数ID,并强制库用户使用这些ID值及其各自的DAO(分数)来获取分数值和类别值(懒惰获取)。和类别)。

所以我相信你在做什么看起来不错

希望这会有所帮助