我的应用程序有一个名为“events”的表,每个事件在“eventdata”表中都有大约 30 个标准字段,而且还有可以是任何名称或类型的用户定义字段。用户可以通过指定 x 个字段(文本/双精度/日期时间/布尔值)以及这些字段的名称来定义这些事件数据表。对于每个“事件”,此“事件数据”(表)可以不同。
我当前的方法是为定义创建一个查找表。因此,如果我需要查询每个记录的所有“事件”和“事件数据”,我会使用两个查询在 M-D 关系中执行此操作(即从事件中选择 *,然后对于“事件”中的每个记录,从“某个表”中选择 *) )。
有更好的方法来做到这一点吗?到目前为止,我已经实现了这一点,但我的大多数查询需要对数据库进行两次不同的调用 - 我不能简单地将我的主“事件”表与“事件”中的每条记录的不同“事件数据”表连接起来。
我想我的主要问题是:我可以将主表与每条记录的不同详细表连接起来吗?
E.g.
SELECT E.*, E.Tablename
FROM events E
LEFT JOIN 'E.tablename' T ON E._ID = T.ID
如果没有,考虑到我不知道可能有多少用户定义字段以及它们的类型,是否有更好的方法来设计我的数据库。
有四种方法可以处理这个问题。
添加几个名为“Custom1”、“Custom2”、“Custom3”等的附加字段。这些字段的数据类型应为 varchar(?) 或类似的数据类型
添加一个字段来保存非结构化数据(如 XML 列)。
创建与某种类型的模板关联的名称/值对表。让他们管理模板。您必须使用数据透视表或类似的工具来获取数据。
使用像这样的数据库MongoDB http://www.mongodb.org/或其他NoSql http://en.wikipedia.org/wiki/NoSQL风格产品来存储这个。
上面说,第一个优点是速度快,但将自定义字段的数量限制为您定义的数量。较旧的主机类型应用程序以这种方式工作。 SalesForce CRM 曾经使用过。
第二个选项意味着每条记录都可以有自己的自定义字段。然而,根据您的数据库,这里存在一定的挑战。试过这个,不推荐。
第三种通常更难编码,但具有极大的灵活性。 SalesForce 和其他应用程序已经走了这条路;包括我负责的一对夫妇。缺点是微软显然已经获得了这种方式的专利,并且正在申请中。起诉几家公司 http://www.theregister.co.uk/2010/05/19/microsoft_salesforce_patent_litigation/超过它。就我个人而言,我认为这是废话。但是无所谓。要点是,使用风险自负。
第四个选项很有趣。我们已经使用了它一点,性能非常好,而编码非常简单。这可能是非结构化数据的最佳选择。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)