我正在创建一个数据输入应用程序,允许用户创建条目架构。
我的第一个版本只为每个条目架构创建了一个表,每个条目跨越具有相应数据类型的单个或多个列(对于复杂类型)。这允许“快速”查询(在小数据集上,因为我没有索引所有列)和简单同步,其中数据条目分布在几个数据库上。
我对这个解决方案不太满意;唯一积极的是简单...... 我只能存储固定数量的列。我需要在所有列上创建索引。我需要重新创建关于模式更改的表。
我的一些关键设计标准是:
我一直在考虑一些可能的设计,但它们似乎都不是一个好的选择。
解决方案1:Union表包含Type列和每个类型一个可为空的列。
这可以避免连接,但肯定会占用大量空间。
解决方案2:键/值存储。所有值都存储为字符串并在需要时进行转换。
还要占用大量空间,当然,我讨厌将所有内容转换为字符串。
解决方案3:使用xml数据库或将值存储为xml。
没有任何经验我会认为这很慢(至少对于关系模型,除非有一些非常好的xpath支持)。 我还想避免使用xml数据库,因为应用程序的其他部分更适合作为关系模型,并且能够加入数据是有帮助的。
我不禁认为某人已经解决了(某些)这个问题,但我找不到任何东西。不太确定要搜索的内容......
我知道市场调查正在为他们的调查问卷做这样的事情,但是很少有开源实现,而我发现的那些并不适合这个账单。
PSPP有很多我正在考虑的逻辑;原始列类型,许多列,多行,快速查询和合并。太糟糕了,它不适用于数据库..当然......我不需要99%的提供功能,但很多东西都不包括在内。
我不确定这是一个提出这样一个设计相关问题的正确位置,但我希望这里有人有一些提示,了解任何现有工作,或者可以指出我更好的地方提出这样的问题。
提前致谢!
答案 0 :(得分: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语句。