2

我们目前正在考虑为我们的 Web 应用程序实现自定义字段的不同方法。用户应该能够为某些实体定义自定义字段并填写/查看此数据(并可能稍后查询数据)。

我知道有不同的方法来实现自定义字段(例如使用名称/值表或使用更改表等),我们目前倾向于使用 ALTER TABLE 将新的用户字段动态添加到数据库中。

在浏览了其他相关的 SO 主题后,我找不到这个解决方案的任何大缺点。相比之下,可以选择快速查询数据(例如,直接使用 SQL 的 where 语句)对我们来说是一个很大的优势。

通过这种方式实现自定义字段,您会想到什么缺点吗?我们谈论的是一个最多可供 100 个用户同时使用的 Web 应用程序(不是并发请求..),并且可以同时使用 MySQL 和 MS SQL Server 数据库。

4

3 回答 3

2

作为更新,我们决定通过 ALTER TABLE 将新列添加到现有数据库表中以实现自定义字段。经过一些研究和测试,这看起来是大多数数据库引擎的最佳解决方案。包含自定义字段元信息的单独表格提供了管理、查询和使用自定义字段所需的信息。

于 2010-09-06T11:47:28.647 回答
2

我看到的第一个缺点是您需要为您的应用程序服务授予 ALTER 权限。
这意味着您的安全模型需要特别注意,因为应用程序不仅可以添加字段,还可以删除和重命名它们并创建一些表(至少对于 MySQL)。

其次,您将如何区分每个用户所需的字段?或者用户A创建的字段可以被用户B访问吗?

请注意,列的基数也可能会显着增长。如果每个用户添加 2 个字段,我们已经在谈论 200 个字段。

就个人而言,我会使用两种方法中的一种或混合使用:

  1. 使用序列化字段

我会在表中添加一个文本字段,我将在其中存储一个或多个序列化字典:

{ 
  user_1: {key1: val1, key2, val2,...}, 
  user_2: {key1: val1, key2, val2,...}, 
  ...
}

缺点是这些值不容易搜索。

  1. 使用多类型名称/值表

字段表:

user_id: int
field_name: varchar(100)
类型: enum('INT', 'REAL', 'STRING')

值表:

field_id: int
row_id: int #主表行id
int_value: int
float_value: float
text_value: text

当然,它需要连接,实现起来有点复杂,但更通用,如果索引正确,效率很高。

于 2010-02-05T13:51:05.843 回答
1

我认为向数据库表中添加新的自定义字段没有任何问题。

使用这种方法,可以使用特定/最合适的类型,即需要一个 int 字段?将其定义为 int。而对于名称/值类型表,您会将多种数据类型存储为一种类型(可能是 nvarchar) - 除非您使用多个不同类型的列完成该名称/值表并填充适当的列,但这有点可怕.

此外,添加新列可以更轻松地查询/无需涉及到新名称/值表的连接。

它可能感觉不那么通用,但我觉得这比拥有“一刀切”的名称/值表要好。

从 SQL Server 的角度来看(2005 年以后)......
另一种方法是存储创建 1 个 XML 类型的“自定义数据”字段 - 这将是真正通用的,不需要创建字段或需要单独的名称/值表。还有一个好处是,并非所有记录都必须具有相同的自定义数据(即一个字段是常见的,但它包含的内容不一定是)。不是 100% 的性能影响,但 XML 数据可以被索引。

于 2010-02-05T13:16:54.820 回答