我正在将类层次结构转换为存储在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中最合理的表示是什么?
有更好的选择吗?