我目前正在为一个网站的想法弄乱一些东西 - 我非常想让我的用户创建保存数据的“表”,然后允许他们查询这些数据(以一种比写起来更令人讨厌的方式SQL 查询,希望比使用 excel 更容易)。
到目前为止,我的想法是在我的数据库中使用几个表来表示这一点 - 一个表表示一个表,一个表表示表的列,一个表表示表中的每一行,最后一个表表示值. 类似于(伪 SQL)的东西:
CREATE TABLE 'Tables' (
Id INT NOT NULL PRIMARY KEY,
NAME VARCHAR(255)
)
CREATE TABLE 'TableColumns' (
Id INT NOT NULL PRIMARY KEY,
TableId INT NOT NULL FOREIGN KEY ON 'Tables',
NAME VARCHAR(255)
)
CREATE TABLE 'TableRows' (
Id INT NOT NULL PRIMARY KEY,
TableId INT NOT NULL FOREIGN KEY ON 'Tables',
RowNumber INT NOT NULL
)
CREATE TABLE 'TableValues' (
RowId INT NOT NULL PRIMARY KEY,
ColumnId INT NOT NULL PRIMARY KEY,
Value VARCHAR(255)
)
(请注意,TableValues 表在这里有 2 个主键字段,它应该代表一个“复合”主键,不要太在意我的语法不是合法的 SQL,它只是应该显示这个想法)。
我对此进行了一些测试,并能够成功地进行简单的查询(简单的过滤、排序等)。我这样做的方法是首先查询 TableRows 表 - 为了进行过滤,我然后过滤掉了列与条件不匹配的行,并且为了排序,我根据列的内容对 RowIds 进行了排序(由指定的排序指定)。生成按所需顺序排列的行 ID 列表,从这里开始只是选择需要的内容。
所有这一切都很好,但从这里开始我有点卡住了。我希望能够以某种方式表示不同的数据类型(这确实是我的主要问题),然后再研究如何进行连接。
在考虑所有这些时,我开始怀疑是否有更好的方法来做到这一点。请注意,这里的性能当然是一个因素,但我不打算支持具有数十万行的虚拟表,每个虚拟表可能大约 1000 行 - 当然整个系统需要能够处理许多这些。
我知道我总是可以在我的数据库中实际创建表,并在 C# 中动态创建查询来完成此操作,同样使用 SQL 查询进行查询 - 但是我从来都不喜欢让用户对我的数据库“构建”查询像这样 - 在我看来,这似乎会导致出现许多错误的路径 - 在最坏的情况下最终允许用户以一种或另一种方式杀死数据库。
此外,我的问题变成了如何以从 C# 角度来看有意义的方式来处理这个问题。到目前为止,我认为我倾向于使用 LINQ,然后创建自己的扩展方法来应用所需的功能——即扩展 IQueryable 的 ExtensionMethods。
所以我真正想要的是一些关于如何做到这一点的想法,关于如何调整性能的想法,关于如何处理表中单独数据类型的想法(当然将类型存储在 tablecolumn 中,但是如何实际存储该值,以便我可以按它过滤、排序等?- 不只是在我的 tablevalues 表上添加“TextValue”、“MoneyValue”等列)。最后但并非最不重要的一点是,希望在这里进行一些很好的讨论——我至少认为这是一个有趣的话题。