-2

我目前正在开发一个系统,该系统可以自动对数据库课程中学生提交的内容进行评分。他们的一项任务是创建一个关系模型,其形式为

<TableName>(<Attr1 name>:<datatype>(PK), <Attr2>:<datatype>, ..., <Attr3>(FK))

(PK) ... 主键,(FK) ... 外键

解析效果很好,所有表(在 txt 文件中逐行写入)都转换为 java 对象,其属性列表包含名称、类型(普通、主要、外国)和数据类型。我还为数据类型构建了一个抽象,因此例如 varchar 和 char、character ... 被作为文本处理,而进一步的规范如 int**(128)** 被忽略。

到目前为止一切顺利,我现在有一个问题,我需要将提交与模板进行比较,两者格式相同,并检查表是否具有相同的属性数据类型和外键“足迹”,但所有名称(表名和属性名称)可以是任意的。如果多个表具有相同的足迹但不同的外键怎么办?我需要无限深地检查所有引用的表(理论上)。

到目前为止我所读到的内容:据我了解,关系模型只不过是一张图。该图不一定需要是平面的(也不是其他例外之一),因此https://en.wikipedia.org/wiki/Graph_isomorphism_problem中描述的问题与我相关。

我很想听听您对此主题的方法或意见。是否最好只接受具有独特足迹的表格并将其余部分留给手动评分?我是否错过了接受所有可能模式的合法方式?

谢谢!

4

1 回答 1

0

解决方案将取决于您对算法的确切期望输出。

如果你只是想得到一个答案是否正确,你可能不需要深入研究图论。您可以将单个表的占用空间定义为每种数据类型的字段数和外键数。因此,具有 3 个字符属性、4 个数字属性和 2 个外键的表将获得足迹3c4n2f。(我假设总是需要一个主键。)在第一步中,您检查学生解决方案中每个足迹的表数是否正确。无论如何,您将需要一些外键的命名约定,因此在第二步中,您将检查它们的正确性,按相等的足迹对表进行分组。如果有几张桌子有足迹,应该很容易检查3c4n2f,其中哪些具有表A和B所需的外键。如果您没有这样的命名约定,将无法检查正确性,因为无法确定外键指向哪个表.

但是,这种方法不会帮助您评估不是 100% 正确的解决方案。假设一个学生刚刚错过了一个属性,所以表格足迹出来了3c3n2f。现在这个表与模板中的正确表不匹配,上面的检查将得出解决方案是错误的。但是,与一些放错位置的 FK 相比,这可能被认为是一个小错误。要找到这一点,您提到的图论方法似乎很合适。

但即使是这种解决方案也可能缺乏。同样,它只会告诉您这些图是否同构。它不会说明错误只是一个小小的疏忽还是一个根本性的误解。这让我想到了问题的核心。

是要求。你追求的目的是什么?我只能猜测它正在减少阅读和评估学生提交的工作量。只告诉你“正确”或“错误”的算法可能是万无一失的,但它不会为你节省很多工作,因为大多数提交可能至少会有一些小故障,这会让你重新阅读和理解它们中的每一个. 如果您希望算法更有帮助,则必须提高标准:计算的结果究竟应该是什么。您认为什么是可以自动评估的小错误,因此只有少量提交需要您自己评估?数据库理论无法给出答案,因为它基本上是数学,只知道对与错。

于 2020-11-15T15:45:36.403 回答