我正在开发一个用户可以使用块编写测试的应用程序。块是命令(如assign
、等) for
,if
因此一些块也可以包含其他块。
我们正在使用复合模式 - 有一个abstract block
和leaf
&composite
块类(也是抽象的),具体块从相关类继承(if
块是复合的,assign
块是叶子)。
我们曾经序列化整个测试并将其保存为 blob,但我们正在考虑更改它(例如,启用测试内部的搜索)。
那么数据库设计应该是什么样子的呢?我应该为每个对象准备一张桌子吗?在我们的例子中,这意味着大约 30 张桌子。我们是否应该将块的类型作为列包含在内?这意味着我们将拥有一个巨大的if-else
在某处切换。
我很感激你的见解和建议。
谢谢。
问问题
39 次
1 回答
2
您应该为每种对象都有一个表格。同类型的多个实例应该存储在同一张表的多行中,使用不同的数据来区分它们。
两个对象是否属于同一类型的问题可能很微妙,尤其是在您概述的情况下。这是我的建议。对您打算处理的所有对象进行面向对象分析。小心区分面向对象的分析和面向对象的设计。如果需要,请查阅教科书。大约 20 年前,Peter Coad 写了一些关于 OOA 的好书。
将 OOA 模型转换为 ER 模型,将行为排除在外,只保留数据。保留 OOA 模型,因为在您设计软件时拥有它会很有用。ER 模型可以适应 gen-spec 模式,因此如果您的模型中有对象的类和子类,请使用此功能。在你的情况下,你会的。
然后将您的 ER 模型转换为关系模型,为将关系模型转换为一系列 SQL 数据定义脚本做准备。类和子类在这一点上变得混乱,因为关系模型没有内置继承。请参阅关于所谓的“类表继承”的教程。SO中有很多CTI问题的答案。
如果您正确执行 CTI,则不需要将对象类型(类)作为单独的字段,但如果它会加快速度,您可以将其包含(非规范化)。除非有必要,否则我一般不会这样做。
于 2012-09-10T14:19:26.307 回答