如何将用户自定义数据添加到数据库?
我想设计一个将存储注释的sqlite数据库。这些笔记中的每一个都有共同的字段,如标题,截止日期,详细信息,优先级和已完成。如何将用户自定义数据添加到数据库?
此外,虽然,我想为更专业的音符一样的价格购物清单的项目和作者/出版商数据书籍添加数据。
我也想有一些通用的领域,用户可以用任何文本数据,他们希望填补。
如何在这种情况下设计我的数据库表?
我可能只是对每一块数据的每一个音符一个领域,而是会浪费很多的领域,我想有其他的选择和建议。
你可以创建类似于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有两个附加字段。第一个有一个价值“企鹅”,代表出版商。第二个具有“红色”的值并且表示颜色。
那么什么是远归它这点?
- 您不会浪费空间为每个项目添加字段(通过m2m表格将注释与其附加动态字段关联起来)。
- 你不是存储冗余标签(您可以继续但存储冗余数据,因为相同的发布很可能出现很多次......这方面是非常主观的。如果您想了解您的发布丰富的数据,你通常希望采取将其变成自己的实体,而不是一个特设的字符串的步骤。使这一飞跃的时候,因为它增加毛羽到数据库的额外水平要小心。因此评估使用情况。
的dynamic_note_field作为你的数据定义,如果你有兴趣回答一个问题,比如“我创建的附加字段是什么”,这可以让你轻松地做到这一点,而不必搜索所有的dynamic_note_field_data。最终,你可能会添加额外的信息表这样一个是一个type
字段。我喜欢从蝙蝠身上创造这种分离,但这可能违反了YAGNI原则。
缺点:
这不是太糟糕来搜索有一个出版商,其中该发布者是“企鹅”所有的音符。
棘手的事情就像“在任何领域找到值为'企鹅'的任何音符”。你不知道哪个领域是你的搜索。在这一点上,你最好使用一个单独的索引,这个索引与标准化的数据库数据一起生成,这些数据充当了事实的真相。同样,关于规范化的好处在于,您将数据保持在无损,无损状态。
有几种标准方法可以用来解决这种情况。
您可以为每种笔记创建单独的表,在每种情况下复制公共列。这很容易,但它会使查询所有笔记变得困难。
-
您可以创建包含多列的一个大表和某种类型的字段,这将让你知道它是哪种类型的说明(并因此列其子使用)
CREATE TABLE NOTE(ID int PRIMARY KEY,NOTE_TYPE int,DUEDATE datetime,...更常见的字段,价格NUMBER NULL,author VARCHAR(100)NULL,..更具体的字段)
-
你可以将你的表分成继承关系像这样:
CREATE TABLE NOTE(ID int PRIMARY KEY,NOTE_TY PE int,DUEDATE datetime,...更常见的字段);
CREATE TABLE SHOPPINGLITITEM(ID INT PRIMARY KEY,NOTE_ID INT FORIENKEY NOTE.ID,价格数...更多购物清单项目字段)
选项1是容易实现,但将涉及大量的主要是多余的表定义。
选项2会很容易地创建和容易写上查询,但会浪费空间
和期权3会更节省空间,减少多余的,但很可能已经因为所有的外键的慢查询。
这是在SQL中对这些关系进行建模的典型权衡集,任何这些解决方案都可能适合用例,而不取决于您的性能要求。
如果你发现你的笔记属于某些“类型”,这比我的建议好得多。我建议的方法非常灵活,但往往会导致非常柔软的物体。使用发布者字段的笔记也具有publish_date字段很难强制执行。 – Koobz 2010-05-09 19:14:06
@Koobz虽然我不需要强制执行。我只需要“类型”具有所有可用的特定字段,而不是填充。 – CodeFusionMobile 2010-05-09 20:05:28
我的应用程序实际上会过滤列表级别的类型。任何说明都可以被视为任何类型,并非所有数据都是必需的。 I.E.购物清单物品可以放在待办事项清单上,但它会显示到期日而不是物品价格和数量。它几乎没有类型 – CodeFusionMobile 2010-07-10 13:52:43
对于要存储的数据,但不一定要搜索,另一个选项是将其序列化到/来自JSON并将其存储在TEXT列中。这给你任意的结构,但你不能随时查询这些值。
另一种选择是转储SQLite并转到对象数据库。我似乎记得有一两个Android的工作。然而,我还没有尝试过这些。
只需创建一个包含所有笔记共同字段的小表。 然后为每一类特殊笔记提供一张表格,其中包含所有额外字体以及第一张桌子上的参考。
对于您要输入的每个便笺,您将在主表(包含常用字段)中创建一行,并在额外表中包含额外字段的行以及对主表中的行的引用。 然后你只需要加入你的请求。
有了这个解决方案: 1)你有一个安全设计(不能访问 2)你的数据库将得到优化
我喜欢你的方法提供了额外的灵活性,这是不是你的注意部分字段) 。任何其他方式,我将不得不限制用户可用的自定义字段的数量。这样,他们可以动态地创建新的。搜索功能的丧失是一个问题,但我更关心维护引用完整性,因为我使用的sqlite版本无法强制执行外键。 – CodeFusionMobile 2010-05-09 20:12:40