使用多个表是处理用户定义字段的可取解决方案吗?

时间:2010-01-20 21:52:37

标签: sql-server oracle design-patterns database-design

我正在研究一个问题,该问题涉及用户将具有各种字段结构的记录列表上传到应用程序中。第二部分是允许用户指定字段来捕获信息。

这是我迄今为止所做的任何事情,我自己设计了一个静态RDMS结构。在某些方面,所有记录都将被视为相同,因此每个记录都需要一些共同的字段。几乎所有查询都将在这些公共字段上运行。

我的第一个想法是为每个导入动态生成一个新表,为每个数据捕获字段spec动态生成另一个表。然后为应用程序中的每个记录创建一个带有guid的主表以及公共字段,然后指定指定的字段导入数据的表的名称以及包含数据捕获字段的表的名称。

有关动态生成的表中字段的更多信息(元数据?)可以存储在xml或“属性”表中。

这意味着当用户登录应用程序时,我将动态地选择要呈现给用户的数据表,并且如果不仅说多用户而且多租户,那么数据库中将会有大量表。

我的问题是有没有其他方法来解决这种可变场问题,我是否会在这里找到一条未经修改的路径?

我相信EAV会要求我有一个表格,用于定义每个导入/数据捕获规范的字段,然后是另一个表格,其中包含import - field - values数据,这似乎是不切实际的。

3 个答案:

答案 0 :(得分:1)

我讨厌在数据库中存储XML,但这是一个很有意义的完美示例。最初以XML格式存储用户导入。随着数据模式的成熟,您可以稍后决定哪些表可以为更大的客户端保留。当用户选择他们想要查询的字段时,就是当你回来并构建一个可靠的模式时。

答案 1 :(得分:0)

每个领域是什么类型的?每个记录的字段类型可能不同吗?

我正在开发一个程序,现在可以执行此操作,我们处理它的方式基本上是一个指向记录字段表的记录表。 recordfield表包含所有字段以及数据库中实际字段的字段名称(列名称)。然后我们有一个记录数据表,这是每个记录的所有数据。我们还存储了一个record_id,告诉它它正在保存哪条记录。

这就是我们如何做到这一点,如果记录的每一列是相同的类型,那么我们不需要向表中添加新列,如果它有更多字段或不同类型的字段,那么我们根据需要添加字段到数据表。

我认为这就是你所说的......如果我错了,请纠正我。

答案 2 :(得分:0)

我认为用户可以添加字段的表的每种用户定义字段的附加表是一个很好的方法。

假设您将记录加载到user_records(id)中,该表将具有id列,该列是用户定义的字段表中的外键。 用户定义的字符串字段将位于user_records_string(id,name)中,其中id是user_records(id)的外键,name是字符串,或者是用户定义的字符串字段列表的外键。

搜索它们需要将它们连接到基表,可能使用子选择来根据用户元数据过滤到一个字段,以便可以将正确的字段添加到查询中。

要模拟创建多个表的用户,可以在user_records表中使用指向表列表的外键,并在查询单个表时对其进行过滤。

这将允许您的架构是静态的,同时允许用户任意添加字段和表。