我有一个为Java API Documentation设计数据库的场景,我必须在其中提供有关给定代码段中每个类和方法的信息。例如,考虑:
1. main()
2. {
3. String foo="test";
4. foo.substring(1,2);
5. }
在这里,我必须从Java文档中显示类 String
和方法 substring
的文档(类/方法可以是任何有效的类/方法)。
我的观察:
这些类可能会在各种包中重复,因此它们不能是唯一的。方法也是如此。
方法名称foo()
可以是:
1)本课程的方法
2)覆盖某些父类的方法
3)简单地继承a方法。
有了这些信息,我有以下表格:
1)
CREATE TABLE "JAVACLASSDESCRIPTION"
( "CLASSFULLNAME" VARCHAR2(400) NOT NULL ENABLE,
"CLASSNAME" VARCHAR2(400),
"CLASSDEFINATION" CLOB,
"CLASSDECLARATION" CLOB,
"INHERITEDCLASSES" CLOB,
CONSTRAINT "JAVACLASSDESCRIPTION_PK" PRIMARY KEY ("CLASSFULLNAME") ENABLE
) ;
INHERITEDCLASSES
是一个多值属性。我知道这是一个非常糟糕的事情,但我有理由。
1)首先检查方法是否在JAVAMETHODDESCRIPTION
表中可用(作为类方法本身或覆盖方法)。
2)如果没有,它必须是一个为某些父类继承的方法。所以我们必须显示这个父类的方法的文档。为了保存多个搜索,值INHERITEDCLASSES
包含如下(对于一些随机类):
java.lang.Object: clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
因此它的父类是java.lang.Object
,后跟方法列表,因此很容易匹配方法名称。
2)
CREATE TABLE "JAVAMETHODDESCRIPTION"
( "CLASSFULLNAME" VARCHAR2(400) NOT NULL ENABLE,
"METHODNAME" VARCHAR2(400) NOT NULL ENABLE,
"METHODDECLARATION" VARCHAR2(400),
"METHODDEFINATION" CLOB
) ;ALTER TABLE "JAVAMETHODDESCRIPTION" ADD CONSTRAINT "JAVAMETHODDESCRIPTION_FK" FOREIGN KEY ("CLASSFULLNAME")
REFERENCES "JAVACLASSDESCRIPTION" ("CLASSFULLNAME") ON DELETE CASCADE ENABLE;
示例输出:
我知道有很多设计问题。如何改进我的数据库设计?
修改
关于多值条目,如果分解为另一个表可能导致冗余条目。例如。 Object
类是所有人的超类。
答案 0 :(得分:0)
进行类似这样的事情的最佳方法是进入第3范式。你可能不会留在那里,但至少通过“看到它”,你会学到一些关于你的系统,关系等方面的东西。
http://en.wikipedia.org/wiki/Third_normal_form
一旦你进入那个阶段,然后开始查看你拥有的东西,并问问自己它将如何适应你的具体情况。即你是如何访问它的...它是否会表现不佳,是否有助于对事物进行非规范化以帮助提高查询性能等等。
答案 1 :(得分:0)
很难说出一切,因为很多事情都没有说明,但是:
要考虑的一些事项:加载的java类由唯一的全名(x.y.z.Myclass $ Inner.class)和它的类加载器标识。如果你不关心加载的类但只关心源代码(javadoc)那么你可以跳过类加载器。
javadoc可以在方法,类,包和字段级别(每个都可以通过签名唯一标识)
如果你想支持继承方法的javadoc,那么你需要建模多重继承(javadoc也可以从接口继承),并在你的应用程序中遍历那个树顶请求显示javadoc。其他选项是在将内容保存到db
期间进行遍历另一件事是库和jdk的版本控制。不知道你是否想要支持不同的版本。