OID 引用示例
SmartEDB为C开发人员提供了许多方法来实现表之间的关系(连接),包括对象Id或OID,这仅对C和C++ API可用。
下面的“卫星无线电接收器”示例演示了当数据模型包含一组唯一标识主体对象的数据时,如何使用OID来连接两个类。
示例描述
假设一个卫星无线电接收器将处理两种类型的广播数据对象:
- 节目数据:由诸如标题、解说员、内容描述和节目说明等个别节目信息组成;
- 节目时间表:由诸如节目开始时间和持续时间、节目表内的若干时间段(每个时间段具有其开始时间和持续时间)和对描述该时间段的节目的“节目数据”的引用组成。
程序信息通过由上述两类对象构成的数据流进行传输,且节目时间表和节目数据信息可以任意顺序到达。值得注意的是,节目调度信息可能先于节目数据出现在数据流中。
接收机应用程序应保存从当前时间起若干小时内的所有节目信息,并能将每个节目与相应的播出时间段关联起来。当旧数据过期或新数据到来时,系统应及时更新数据库中的时间表和节目数据。为了确保性能,数据必须以足够快的速度写入数据库,以跟上传输速率。此外,每个接收到的数据对象都会被分配一个唯一的标识符,此标识符同样由卫星广播。
下面为示例代码:
ProgramData
{
Object ID;
TitleSize;
Title;
NarratorSize;
Narrator;
For(I = 0;I < MaxDescriptions;I++)
{
ContentDescriptionText | ProgramDescriptionText
}
};
ProgramSchedule
{
StartTime;
Duration;
NumberOfTimeSlots;
For(I = 0; I < NumberOfTimeSlots; I++)
{
SlotStartTime;
SlotDuration;
Program_data_ID;
}
};解决方案设计
遵循面向对象设计原则,引入两个对应于现实实体的类是合理的:ProgramData和ProgramSchedule。ProgramData类始终包含标题(Title)和主持人(Narrator)字段,而节目描述文本(ProgramDescriptionText)和内容描述文本(ContentDescriptionText)对于特定节目可能是可选的。在SmartEDB术语中,这些字段应声明为可选,并通过结构体实现。两个类之间没有共享的数据结构。为了能够在适当的时间段引用特定节目,ProgramData类将使用对象标识符(OID)进行声明。每个ProgramSchedule对象包含一个时间段数组,该数组将作为向量实现。为了确保时间表按时间顺序排序,将基于开始时间声明树索引。尽管可以获取ProgramSchedule对象的OID,但没有必要保留它。这两个类之间的唯一关联是通过放置在时间段中的ProgramData对象的引用实现的。
在 C 或 C++ 项目中,此实际数据流可以通过以下 SmartEDB 模式进行形式化:
struct ProgId
{
uint4 id; // 这将保存应答器提供的对象 ID。
};
declare database GuideDb;
declare oid ProgId[5000];
struct ContentDescription
{
string Text;
};
struct ProgramDescription
{
string Text;
};
class ProgamData
{
string Title;
string Narrator;
optional ContentDescription CText;
optional ProgramDescription PText;
list;
oid;
};
struct TimeSlot
{
uint4 StartTime;
uint2 Duration;
ref pId; // 对 ProgramData 对象的引用
};
class ProgramSchedule
{
uint4 StartTime;
uint2 Duration;
// 在此计划期间,可以有任意数量的时间段,所以我们使用一个向量。
vector <TimeSlot> Slot;
// 为了快速定位某个日程安排的程序信息,或者按开始时间升序获取日程安排,我们使用索引。
tree <StartTime> iStartTime;
};