【问题标题】:Tree-Structures & SQL - Looking for design recommendations树结构和 SQL - 寻找设计建议
【发布时间】:2020-10-09 16:28:39
【问题描述】:

从我迄今为止的研究来看,这个主题既有据可查,也非常广泛。所以我希望你能给我一些时间来深入了解如何将树存储在数据库中,为我指明正确的方向。

我正在处理问卷,类似于 HL7/FHIR 处理问卷的方式:有两个类:问卷和项目,问卷由一组项目组成。但是,项目可以引用任意数量的附加项目(即孩子)。所以基本上,我有一个 n 元树状结构 - 取决于你想如何看待它 -a)一个问卷对象作为根和若干项作为子项b) 若干项作为根(即森林),每个项又有若干项作为子项

class Questionnaire {
    items: Set<Item>

    inner class Item {
        children: Set<Item>
    }
}

不幸的是,这部分数据结构是不可协商的(除了使用内部类,我可以更改)。

我现在正在寻找一种明智的方式来将这种结构存储在我的数据库(目前是 MySQL)中。

幸运的是,我只是存储和阅读整个调查问卷。我不需要访问单个节点或分支,并且数据不会更改/更新(因为根据我的项目定义,对现有问卷的任何更改都会导致新的问卷)。所以我只需要使用 SELECT 和 INSERT 语句,每个语句对应一个完整的问卷(包括所有项目)。

我的第一种方法是颠倒 Item-to-Item 关系,即指一个父母而不是几个孩子。但是,我担心这可能会转化为已经固定的对象结构。我希望有一个相当简单的解决方案。

请注意,我知道使用 ORM 可能有非常好的解决方案,但我最近一直无法理解整个设置进度,现在时间紧迫,无法深入了解。现在,我需要一个纯 SQL 的解决方案来显示结果。 ORM 将不得不稍等片刻,但我会回到这一点!另外请注意,现在性能并不重要。

提前感谢您的努力,我们将非常感谢您的帮助!

【问题讨论】:

  • MySQL 支持将数据存储为 JSON 格式的字符串。由于我的数据无论如何都必须可以表示为 JSON,而且我只编写和读取整个(嵌套)对象,我不能通过使用该功能来规避设计问题吗?

标签: sql tree


【解决方案1】:

所以如果其他人正在寻找答案,我最终会这样做:

以我的QuestionnaireResponse类为例:

data class QuestionnaireResponse (
    val qID: String, 
    val timeStamp: String,
    val items: List<Item> = listOf<Item>()) {

    inner class Item (val itemID: String, val itemType: String, var unit: String,
                      var answers: MutableList<String> = mutableListOf())
}

qID 引用此处已回答的Questionnaire。 当Questionnaire 得到答复时,我将收到 JSON 格式的上述对象。我决定将传入的 JSON 解析为我的数据结构,提取 qIDtimeStamp,并将这些值存储在我的数据库中。这样我就可以只选择那些回答特定QuestionnaireQuestionnaireResponses,并按timeStamp 过滤,同时仍然避免尝试将那个(基本上是递归的)结构表示到我的数据库中。

创建对应表的SQL代码如下:

CREATE TABLE `questionnaireresponses` (
  `questionnaireID` int NOT NULL,
  `timestamp` varchar(25) NOT NULL,
  `questionnaireResonseObject` json DEFAULT NULL,
  PRIMARY KEY (`questionnaireID`,`timestamp`),
  CONSTRAINT `answeredQuestionnaire` FOREIGN KEY (`questionnaireID`) REFERENCES `questionnaires` (`id`))

根据我的阅读,并非所有数据库都支持json 数据类型。它在 MySQL 中所做的是确保插入的数据格式正确。我从不介意额外的检查,但由于在将 JSON 插入 Db 之前,我已经在应用程序中成功解析了 JSON,因此可以省略该步骤。因此,如果您的 Db 不支持 json-type,则任何允许存储可变长度字符串(例如 text 或 blob)的类型都可以正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-07
    • 2016-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-03
    相关资源
    最近更新 更多