代码之家  ›  专栏  ›  技术社区  ›  CodeFusionMobile

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

  •  0
  • CodeFusionMobile  · 技术社区  · 15 年前

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

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

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

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

    我可以只为每个注释的每一条数据设置一个字段,但这会浪费很多字段,我希望有其他的选择和建议。

    4 回复  |  直到 15 年前
        1
  •  2
  •   Tom H zenazn    14 年前

    1. 您可以为每种注释创建单独的表,在每种情况下复制公共列。这很容易,但很难对所有注释进行查询。

    2. 创建表NOTE(ID int主键,NOTE_TYPE int,DUEDATE datetime,…更多常用字段,价格编号为NULL,author VARCHAR(100)NULL,。。更具体的字段)

    3. 创建表SHOPPINGLITITEM(ID int PRIMARY KEY,NOTE \u ID int FORIENKEY注释.ID,价格编号。。。更多购物栏)

    选项1很容易实现,但会涉及大量冗余的表定义。

    选项2易于创建和编写查询,但空间效率较低

    这是在SQL中对这类关系进行建模的典型权衡,这些解决方案中的任何一个都可能适合于非性能需求的用例。

        2
  •  1
  •   Koobz    15 年前

    所以你有你的注释表和它的公共字段。

    现在添加:

    id     label    
    1      publisher
    2      color
    3      size
    

    id     dynamic_note_field_id   value
    1      1                       Penguin
    2      1                       Marvel
    3      2                       Red
    

    最后,您可以将数据实例与它们通过的字段关联起来

    注\u动态\u注释\u字段\u数据

    note_id dynamic_note_field_data_id
    1       1
    1       3
    2       2
    

    现在我们说:note_id 1有两个附加字段。第一个值为“Penguin”,表示发布者。第二个值为“Red”,表示一种颜色。

    那么,到目前为止将其正常化有什么意义呢?

    1. 你没有浪费空间为每个条目添加字段(通过m2m表将注释与其附加的动态字段关联起来)。
    2. 您没有存储冗余标签(您可以继续存储冗余数据,但是同一发布服务器可能会出现多次。。。这方面是非常主观的。如果您想要关于发布者的丰富数据,通常需要将它们转换为自己的实体,而不是一个特殊的字符串。做这个跳跃时要小心,因为它会给数据库增加额外的毛羽。相应地评估用例。

    type 字段。我喜欢即兴制造这种分离,但这可能违反了你的雅格尼原则。

    缺点:

    搜索所有有发布者的便笺也不算太糟,因为发布者是“企鹅”。

        3
  •  0
  •   CommonsWare    15 年前

    对于要存储但不必搜索的数据,另一个选项是将其序列化到/来自JSON,并将其存储在文本列中。这给了您任意的结构,但是您不能很容易地针对这些值进行查询。

    另一个选择是转储SQLite并使用对象数据库。我好像记得有一两个人在为Android工作。不过,这些我都没试过。

        4
  •  0
  •   MounirReg    15 年前

    只需创建一个包含所有注释的公共字段的小表。

    对于要输入的每个注释,您将在主表(包含公共字段)中创建一行,在包含额外字段的额外表中创建一行,并在主表中创建对该行的引用。

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