我正在尝试设计一个存储笔记的sqlite数据库。这些笔记中的每一个都有公共字段,如标题,截止日期,详细信息,优先级和已完成。
此外,我想为更专业的笔记添加数据,例如购物清单项目的价格和图书的作者/出版商数据。
我还希望有一些通用字段,用户可以填写他们想要的任何文本数据。
在这种情况下如何设计我的数据库表?
我可以为每个音符的每个数据提供一个字段,但这会浪费很多字段,我希望有其他选项和建议。
答案 0 :(得分:2)
您可以使用几种标准方法来解决这种情况。
您可以为每种笔记创建单独的表格,在每种情况下复制公共列。这很容易,但是很难查询所有笔记。
您可以创建一个包含许多列和某种类型字段的大型表,它可以让您知道它是哪种类型的注释(以及因此使用哪个列的子集)
CREATE TABLE NOTE(ID int PRIMARY KEY,NOTE_TYPE int,DUEDATE datetime,... more more fields,price NUMBER NULL,author VARCHAR(100)NULL,.. more specific fields)
你可以把你的表分成一个继承关系,如下所示:
CREATE TABLE NOTE(ID int PRIMARY KEY,NOTE_TYPE int,DUEDATE datetime,...更常见的字段);
CREATE TABLE SHOPPINGLITITEM(ID int PRIMARY KEY,NOTE_ID int FORIENKEY NOTE.ID,price number ... more shopping list item fields)
选项1很容易实现,但会涉及大量冗余表定义。
选项2很容易创建并且易于编写查询,但空间效率低下
选项3可以提高空间效率,减少冗余,但由于所有外键,查询可能会更慢。
这是在SQL中对这些类型的关系进行建模的典型权衡取舍,这些解决方案中的任何一个都可能适用于非高性能要求的用例。
答案 1 :(得分:1)
您可以创建类似custom_field表的内容。一旦你开始正常化,它会变得非常混乱。
所以你的笔记表上有它的常用字段。
现在添加:
dynamic_note_field
id label
1 publisher
2 color
3 size
dynamic_note_field_data
id dynamic_note_field_id value
1 1 Penguin
2 1 Marvel
3 2 Red
最后,您可以将数据的实例与他们通过
使用的字段相关联note_dynamic_note_field_data
note_id dynamic_note_field_data_id
1 1
1 3
2 2
所以现在我们已经说过:note_id 1有两个额外的字段。第一个具有值“Penguin”并代表出版商。第二个值为“红色”并表示颜色。
那么到目前为止规范化的重点是什么呢?
dynamic_note_field充当您的数据定义。如果您有兴趣回答诸如“我创建的其他字段是什么”之类的问题,这可以让您轻松完成,而无需搜索所有的dynamic_note_field_data。最后,您可以向此表添加额外信息,例如type
字段。我喜欢用蝙蝠创造这种分离,但这可能违反了你的YAGNI原则。
缺点:
搜索所有拥有发布商的笔记并不是太糟糕,该发布商是“企鹅”。
有些棘手的事情就像“在任何领域找到任何价值'企鹅'的笔记”。你不知道前面哪个领域是你的搜索。此时,您最好使用与标准化数据库数据一起生成的单独索引,该数据充当真实点。同样,规范化的好处在于您将数据保持在非常无损,非破坏性的状态。
答案 2 :(得分:0)
对于您要存储但不必搜索的数据,另一个选项是将其序列化为JSON或从JSON序列化并将其存储在TEXT列中。这为您提供了任意结构,但您无法轻易查询这些值。
另一种选择是转储SQLite并使用对象数据库。我似乎记得有一两个在Android上工作。但是,我没有尝试过这些。
答案 3 :(得分:0)
只需创建一个包含所有笔记的常用字段的小表。 然后是每个特殊音符类别的表格,其中包含所有额外的音符以及第一张表格上的参考。
对于您要输入的每个注释,您在主表(包含公共字段)中创建一行,在额外表中创建一行包含额外字段的行,以及对主表中行的引用。 然后你只需要在你的请求中加入。
使用此解决方案: 1)你有一个安全的设计(不能访问不属于你的笔记的字段) 2)您的数据库将被优化