加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

设计SQL数据库以表示OO类层次结构

发布时间:2020-12-12 16:33:00 所属栏目:MsSql教程 来源:网络整理
导读:我正在将类层次结构转换为存储在SQL数据库中. 原伪码: abstract class Note{ int id; string message;};class TimeNote : public Note{ time_t time;};class TimeRangeNote : public Note{ time_t begin; time_t end;};class EventNote : public Note{ int e
我正在将类层次结构转换为存储在SQL数据库中.

原伪码:

abstract class Note
{
   int id;
   string message;
};

class TimeNote : public Note
{
   time_t time;
};

class TimeRangeNote : public Note
{
   time_t begin;
   time_t end;
};

class EventNote : public Note
{
   int event_id;
};

// More classes deriving from Note excluded.

目前我有几个想法如何存储在一个数据库.

A.将所有音符存储在单个宽表中

该表将包含从注释导出的所有类所需的所有信息.

CREATE TABLE t_note(
   id INTEGER PRIMARY KEY,message TEXT,time DATETIME,begin DATETIME,end DATETIME,event_id INTEGER
);

从Note导出的未来类需要在此表中添加新列.

将每个类映射到一个表

CREATE TABLE t_note(
   id INTEGER PRIMARY KEY,message TEXT
);

CREATE TABLE t_timenote(
   note_id INTEGER PRIMARY KEY REFERENCES t_note(id),time DATETIME
);

CREATE TABLE t_timerangenote(
   note_id INTEGER PRIMARY KEY REFERENCES t_note(id),end DATETIME
);

CREATE TABLE t_eventnote(
   note_id INTEGER PRIMARY KEY REFERENCES t_note(id),event_id INTEGER
);

从Note引出的未来类需要创建一个新表.

C.使用数据库规范化和VARIANT / SQL_VARIANT

CREATE TABLE t_note(
   id INTEGER PRIMARY KEY,message TEXT
);

CREATE TABLE t_notedata(
   note_id INTEGER REFERENCES t_note(id),variable_id TEXT,-- or "variable_id INTEGER REFERENCES t_variable(id)".
                     -- where t_variable has information of each variable.
   value VARIANT
);

来自Note的未来类需要添加新的variable_id.

D.将每个具体类映射到一个表(根据当前答案新添加)

CREATE TABLE t_timenote(
   id INTEGER PRIMARY KEY,time DATETIME
);

CREATE TABLE t_timerangenote(
   id INTEGER PRIMARY KEY,end DATETIME
);

CREATE TABLE t_eventnote(
   id INTEGER PRIMARY KEY,event_id INTEGER
);

从Note引出的未来类需要创建一个新表.

SQL中最合理的表示是什么?
有更好的选择吗?

解决方法

一般来说,我更喜欢使用“B”(即,一个表为基类和一个表为每个“具体”子类).

当然这有一些缺点:首先你必须加入至少2个表,每当你读完一个子类的完整实例.此外,任何必须以任何类型的笔记操作的人将不断访问“基础”表.

但这通常是可以接受的,除非你有极端的情况(数十亿行,需要很快的响应时间等等).

还有第三个可能的选项:将每个子类映射到一个不同的表.这有助于分区对象,但一般来说在开发工作中花费更多.

参见this进行完整的讨论.

(关于您的“C”解决方案,使用VARIANT:我不能评论优点/缺点,因为它看起来像一个专有的解决方案 – 它是什么?Transact-SQL?我不熟悉它).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读