我的应用程序有一个称为“事件”的表,每个事件在“ eventdata”表中都有大约30个标准字段,但用户定义的字段也可以是任何名称或类型。用户可以通过指定x个字段(文本/双精度/日期时间/布尔值)和这些字段的名称来定义这些事件数据表。每个“事件”的“事件数据”(表)可以不同。
我当前的方法是为定义创建查找表。因此,如果我需要查询每条记录的所有“事件”和“事件数据”,那么我会在MD重新分配中使用两个查询来进行查询(即从事件中选择,然后对于“事件”中的每条记录,从“某张表”中选择 )。
有更好的方法来做到这一点吗?到目前为止,我已经实现了这一点,但是我的大多数查询都需要对DB进行两次不同的调用- 我不能简单地将我的主“事件”表与“事件”中每个记录的不同“事件数据”表连接在一起。
我想我的主要问题是:我可以将每个记录的不同明细表加入主表吗?
例如
SELECT E.*, E.Tablename FROM events E LEFT JOIN 'E.tablename' T ON E._ID = T.ID
如果没有,考虑到我不知道可能有多少个用户定义的字段以及它们将是哪种类型,是否有更好的方法来设计数据库。
有四种处理方法。
添加几个名为“ Custom1”,“ Custom2”,“ Custom3”等的其他字段。这些字段的数据类型应为varchar(?)或类似
添加一个字段来保存非结构化数据(如XML列)。
创建一个与某种类型的模板相关联的名称/值对表。让他们管理模板。您将不得不使用数据透视表或类似数据来获取数据。
使用MongoDB之类的数据库或其他NoSql风格的产品来存储它。
上面所说的:第一个优点是速度快,但是将自定义字段的数量限制为您定义的数量。较早的大型主机类型应用程序以这种方式工作。SalesForce CRM曾经使用过。
第二个选项意味着每个记录可以具有自己的自定义字段。但是,根据您的数据库,这里存在一定的挑战。试过这个,不推荐。
第三个通常较难编写代码,但可以提供极大的灵活性。SalesForce和其他应用程序已经走了这条路。包括我负责的一对 不利的一面是,微软显然已经以这种方式获得了一项专利,并且正在就此起诉一些公司。就个人而言,我认为这是胡扯。但是无所谓。重点是,使用风险自负。
第四个选项很有趣。我们已经玩了一点,并且性能非常好,而编码却非常简单。对于非结构化数据,这可能是最好的选择。