2010-05-29 70 views
0

我正在创建一个允许用户创建输入模式的数据输入应用程序。动态数据输入值存储

我的第一个版本只是为每个条目模式创建了一个表,每个条目跨越单个或多个列(对于复杂类型)具有适当的数据类型。这允许“快速”查询(对于小数据集,因为我没有对所有列进行索引)以及简单同步,其中数据条目分布在多个数据库上。

虽然我对此解决方案并不满意,唯一有利的就是简单... 我只能存储固定数量的列。我需要在所有列上创建索引。我需要在模式更改上重新创建表。

我的一些关键设计审核规定是:

  • 非常快速的查询(使用简单的领域特定的查询语言)
  • 写操作并不一定要快
  • 许多并发用户
  • 模式将经常变化
  • 模式可能包含数千列
  • 数据条目可能分布且ne编辑syncronization。
  • 优先考虑的MySQL和SQLite-- DB2和Oracle等数据库不存在问题。
  • 使用.NET /单声道

我一直在思考了几个可能的设计,但他们都不似乎是一个不错的选择。

解决方案1:联合表,包含Type列和每个类型一个可为空的列。

这可以避免连接,但会明确地使用很多空间。

解决方案2:键/值存储。所有值都以字符串形式存储并在需要时进行转换。

也使用了很多空间,当然,我讨厌不得不将所有东西都转换为字符串。

解决方案3:使用xml数据库或将值存储为xml。

没有任何经验,我会觉得这很慢(至少对于关系模型,除非有一些非常好的xpath支持)。 我也想避免一个xml数据库,因为应用程序的其他部分更适合作为关系模型,并且能够加入数据很有帮助。

我不禁认为有人已经解决了(一些),但我无法找到任何东西。不知道要搜索什么...

我知道市场调研公司正在为他们的调查问卷做这样的事情,但是很少有开放源代码实施,而我发现的实际上并不完全符合法案。

PSPP有很多我想到的逻辑;原始列类型,许多列,许多行,快速查询和合并。太糟糕了,它不适用于数据库..当然...我不需要99%的提供的功能,但很多东西没有包括在内。

我不确定这是否是正确的地方去问这样一个设计相关的问题,但我希望这里有人有一些提示,知道任何现有的工作,或者可以指点我一个更好的地方来问这样一个问题。

提前致谢!

+0

http://www.simple-talk.com/opinion/opinion-pieces/bad-carma/ 灵活性成本太高,无法正常工作。您需要的大多数数据可以在没有灵活性功能的情况下进行定义。只能非常谨慎地使用Key/Value存储,不要将其作为设计的基础。没有人愿意像他们所说的那样灵活性,如果它干扰性能和数据完整性(而且会),那么他们就不需要它。如果它使用户界面更难使用(它会),那么他们讨厌使用该应用程序。 每个客户实际上可能只有3或4件他们需要定制的东西。 – HLGEM 2010-06-25 21:06:05

回答

0

您是否已经考虑过最简单的解决方案:为每个数据类型都有一个表,并将数据集的模式存储在数据库中。最简单的办法:

DATASET Table (Virtual "table") 
ID - primary key 
Name - Name for the dataset/table 

COLUMNSCHEMA Table (specifies the columns for one "dataset") 
DATASETID - int (reference to Dataset-table) 
COLID - smallint (unique # of the column) 
Name - varchar 
DataType - ("varchar", "int", whatever) 

Row Table 
DATASETID 
ID - Unique id for the "row" 

ColumnData Table (one for each datatype) 
ROWID - int (reference to Row-table) 
COLID - smallint 
DATA - (varchar/int/whatever) 

要查询的数据集(虚拟表),则必须动态构造使用COLUMNSCHEMA表的架构信息的SQL语句。