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

动态数据输入值存储

  •  0
  • simendsjo  · 技术社区  · 14 年前

    我正在创建一个允许用户创建条目模式的数据输入应用程序。

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

    不过,我对这个解决方案不太满意;唯一积极的是简单…… 我只能存储固定数量的列。我需要在所有列上创建索引。我需要重新创建有关架构更改的表。

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

    • 非常快速的查询(使用简单的特定于域的查询语言)
    • 写不一定要快
    • 许多并发用户
    • 模式将经常更改
    • 模式可能包含数千列
    • 数据条目可能是分布式的,需要同步。
    • 更可取的是MySQL和SQLite——像DB2和Oracle这样的数据库是不可能的。
    • 使用.NET/莫诺河

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

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

    这避免了连接,但将明确使用大量空间。

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

    当然,我不喜欢把所有的东西都转换成字符串。

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

    如果没有任何经验,我会认为这是非常缓慢的(至少对于关系模型来说,除非有一些非常好的XPath支持)。 我还希望避免使用XML数据库,因为应用程序的其他部分更适合作为关系模型,并且能够加入数据是有帮助的。

    我忍不住认为有人已经解决了这个问题,但我什么也找不到。也不太确定要搜索什么…

    我知道市场调查正在为他们的调查问卷做类似的事情,但是很少有开源的实现,而且我发现那些并不完全符合要求。

    PSPP 有很多我正在思考的逻辑:原始列类型、许多列、许多行、快速查询和合并。太糟糕了,它对数据库不起作用。当然……我不需要99%的功能,但不包括很多东西。

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

    事先谢谢!

    1 回复  |  直到 14 年前
        1
  •  0
  •   Kyberias    14 年前

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

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