如何将用户自定义数据添加到数据库?

时间:2010-05-09 18:48:10

标签: sql android database-design sqlite

我正在尝试设计一个存储笔记的sqlite数据库。这些笔记中的每一个都有公共字段,如标题,截止日期,详细信息,优先级和已完成。

此外,我想为更专业的笔记添加数据,例如购物清单项目的价格和图书的作者/出版商数据。

我还希望有一些通用字段,用户可以填写他们想要的任何文本数据。

在这种情况下如何设计我的数据库表?

我可以为每个音符的每个数据提供一个字段,但这会浪费很多字段,我希望有其他选项和建议。

4 个答案:

答案 0 :(得分:2)

您可以使用几种标准方法来解决这种情况。

  1. 您可以为每种笔记创建单独的表格,在每种情况下复制公共列。这很容易,但是很难查询所有笔记。

  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)

  3. 你可以把你的表分成一个继承关系,如下所示:

    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)

  4. 选项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”并代表出版商。第二个值为“红色”并表示颜色。

那么到目前为止规范化的重点是什么呢?

  1. 您不会浪费空间为每个项目添加字段(您通过m2m表将注释与其附加动态字段相关联)。
  2. 您没有存储多余的标签(但是您可能会继续存储多余的数据,因为同一个发布商可能会多次出现......这方面非常主观。如果您想要有关您的发布商的丰富数据,您通常希望采取步骤将它们转换为自己的实体而不是特殊的字符串。进行此跳跃时要小心,因为它会为数据库添加额外的毛羽。相应地评估用例。
  3. dynamic_note_field充当您的数据定义。如果您有兴趣回答诸如“我创建的其他字段是什么”之类的问题,这可以让您轻松完成,而无需搜索所有的dynamic_note_field_data。最后,您可以向此表添加额外信息,例如type字段。我喜欢用蝙蝠创造这种分离,但这可能违反了你的YAGNI原则。

    缺点:

    搜索所有拥有发布商的笔记并不是太糟糕,该发布商是“企鹅”。

    有些棘手的事情就像“在任何领域找到任何价值'企鹅'的笔记”。你不知道前面哪个领域是你的搜索。此时,您最好使用与标准化数据库数据一起生成的单独索引,该数据充当真实点。同样,规范化的好处在于您将数据保持在非常无损,非破坏性的状态。

答案 2 :(得分:0)

对于您要存储但不必搜索的数据,另一个选项是将其序列化为JSON或从JSON序列化并将其存储在TEXT列中。这为您提供了任意结构,但您无法轻易查询这些值。

另一种选择是转储SQLite并使用对象数据库。我似乎记得有一两个在Android上工作。但是,我没有尝试过这些。

答案 3 :(得分:0)

只需创建一个包含所有笔记的常用字段的小表。 然后是每个特殊音符类别的表格,其中包含所有额外的音符以及第一张表格上的参考。

对于您要输入的每个注释,您在主表(包含公共字段)中创建一行,在额外表中创建一行包含额外字段的行,以及对主表中行的引用。 然后你只需要在你的请求中加入。

使用此解决方案: 1)你有一个安全的设计(不能访问不属于你的笔记的字段) 2)您的数据库将被优化