Here, in C++ notation, is the OKI model:
class CourseManagementManager { // single instance class set<CanonicalCourse> canonicalCourses; set<CourseGroup> courseGroups; set<Type> courseGroupTypes; set<Type> courseTypes; set<Type> gradeTypes; set<Type> offeringTypes; set<Type> sectionTypes; set<Type> statusTypes; set<Type> studentTypes; set<Term> terms; set<Type> termTypes; } theCourseManagementManager; class CanonicalCourse { set<CanonicalCourse> canonicalCourses; set<CourseOffering> courseOfferings; set<CanonicalCourse>& equivalentCourses; // could be a CourseGroup set<String> topics; float credits String description; String number; String title; // also needed set<CanonicalCourse> prerequisites; // or course gp. Omitted by OKI }; class CourseOffering { Id assetId; const CanonicalCourse canonicalCourse; // shouldn't this be a set of eqvs set<CourseSection> courseSections; Type status; String description; Type gradingOptionType; String number; const Term term; String title; }; class CourseSection { Type status; // open, closed, etc. Omitted by OKI. Id assetId; // rooms, labs, etc. Should be set String description; Serializable location; String number; set<Agent> roster; set<ScheduleItem> schedule; String title; set<CourseOffering> courseOfferings; // also need enrollment limits etc. }; class Term { set<ScheduleItem> schedule; }; class GradeRecord { const Agent& agent; const CourseOffering& courseOffering; Serializable grade; }; class CourseGroup { set<CanonicalCourse> courses; // a set of references. }; // Grading class GradingManager { set<Assignment> assignments; set<GradeRecord> gradeRecords; set<Type> gradeRecordTypes; set<Type> gradeScales; set<Type> gradeTypes; set<Type> scoringDefinitions; }; class Assignment { const CourseSection& courseSectionId; String description; String displayName; const GradableObject& gradableObject; // what's assigned to be graded const Type gradeScale; const Type gradeType; const Type scoringDefinition; }; class GradeRecord { const Agent& agent; const Assignment& assignmentId; Serializable gradeValue; const Agent& modifiedBy; const Calendar modifiedDate; const Type gradeType; }; // Assessments class AssessmentManager{ set<Assessment> assessments; set<AssessmentPublished> assessmentsPublished; set<AssessmentTaken> assessmentsTaken; set<Evaluation> evaluations; set<Item> items; set<Section> sections; set<Type> assessmentTypes; set<Type> evaluationTypes; set<Type> sectionTypes; set<Type> itemTypes; }; class Assessment { set<Section> section; Serializable data; String description; String displayName; String topic; }; class AssessmentPublished { const Assessment assessment; set<AssessmentTaken> assessmentsTaken; CourseSection& courseSection; Serializable data; const Calendar date; String description; String displayName; Id gradingAssignment; }; class AssessmentTaken { set<Evaluation> evaluations; // summative from per-sections evals set<SectionTaken> sectionsTaken; const AssessmentPublished& assessmentPublished; const Agent& agent; // student Serializable data; const Calendar date }; class Evaluation { Serializable data; const Agent& modifiedBy; // these should be expanded to lists const Calendar modifiedDate; const ObjectTaken& objectTaken; // the item, section, or assessment // being evaluated }; class Item { Serializable data; // answer, rubric, etc. String description; String displayName; }; class ItemTaken { Serializable data; set<Evaluation> evaluations; const Item& item; // master copy of this item const SectionTaken& sectionTaken; }; class Section { set<Item> items; // questions/problems set<Section> sections; // subsections Serializable data; // whatever String description; String displayName; }; class SectionTaken { const Section& section; // master copy of this section set<Evaluation> evaluations; // from evals of items & subsections taken Serializable data; // ?? grading formulae? set<ItemTaken> itemsTaken; set<SectionTaken> sectionsTaken; // subsections taken const AssessmentTaken& assessmentTaken; // ? parent section or assessment };