我正在创建一个数据输入应用程序,其中允许用户创建输入模式。

我的第一个版本刚刚在每个条目架构中创建了一个单个表,每个条目涵盖了一个或多个列(对于复杂类型),并具有适当的数据类型。这允许“快速”查询(在小数据集上,因为我没有索引所有列)和简单的同步,其中将数据输入分布在几个数据库上。

我对这个解决方案不太满意。唯一积极的事情是简单性...我只能存储固定数量的列。我需要在所有列上创建索引。我需要重新创建模式更改的表。

我的一些关键设计标准是:

  • 非常快速的查询(使用简单的域特定查询语言)
  • 写信不一定要快
  • 许多并发用户
  • 模式会经常改变
  • 模式可能包含数千列
  • 数据输入可能是分发的,需要同步。
  • 最好的MySQL和SQLITE-诸如DB2和Oracle之类的数据库是不可能的。
  • 使用.NET/MONO

我一直在想一些可能的设计,但是它们似乎都不是一个不错的选择。

解决方案1:类似于包含类型列的表和每种类型的一个无效列。

这避免了连接,但肯定会使用很多空间。

解决方案2:密钥/值存储。所有值均作为字符串存储并在需要时转换。

还要使用很多空间,当然,我不得不将所有内容转换为字符串。

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

没有任何经验,我认为这很慢(至少对于关系模型,除非有一些非常好的Xpath支持)。我还想避免使用XML数据库作为应用程序的其他部分作为关系模型,并且能够加入数据很有帮助。

我不禁以为有人已经解决了一些问题,但是我找不到任何东西。不太确定要搜索什么...

我知道市场研究正在为他们的问卷做这样的事情,但是几乎没有开源实施,我发现的实施不太符合该法案。

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

我不确定这是问这个与设计有关的问题的正确地方,但是我希望这里有人有一些技巧,知道任何现有的工作,或者可以将我指向一个更好的地方来提出这样的问题。

提前致谢!

有帮助吗?

解决方案

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

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语句。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top