首页 > 解决方案 > 处理 CustomField 插入 - 哪个选项更高效且更易于维护

问题描述

我们有以下表结构:

用户表

UserId  CompanyId   FullName    Email
1       1           Alex        alex@alex.com
2       1           Sam         sam@sam.com
3       2           Rohit       rohit@rohit.com 

自定义字段表

CustomFieldId   CompanyId   Name             Type
1               1           DOB              Datetime
2               1           CompanySize      Number
3               2           LandingPage      Text

自定义字段值表

UserId  CustomFieldId   DatetimeValue   NumberValue TextValue
1       2               01-01-2020      
1       2                               10  
1       3                                           Home
2       1           
2       2                               20  
2       3                                           Product

请考虑以下事实:

  1. 特定 CompanyId 中有数百万用户
  2. 在 UI 中显示特定用户时,我们需要显示最终客户可以填写的所有自定义字段。

在这种情况下如何处理 CustomFieldValues 表?我们正在考虑以下选项

  1. 当为特定 CompanyId 创建新的 CustomField 行时,有一个 After Insert 触发器以在 CustomFieldValue 表中为所有用户创建所有相应的行。

    • 我认为这会产生为 CustomFieldValue 表中的每个自定义字段创建这么多行的初始成本。(这也可能会锁定表,应用程序的用户将不得不等到所有插入完成)。
    • 从公司中删除 CustomField 行时删除所有 CustomFieldValue 行的相同问题
    • 但是对于 UI 和后端开发人员来说更容易,因为他们不需要担心 CustomFieldValue 是否没有为公司创建的自定义字段的条目
  2. 将 CustomField 添加到公司时,不要创建 CustomFieldValue 行。每当用户填写 UI 视图中的相关输入字段时,创建 CustomFieldValue

    • 这将具有可忽略的插入成本,并且用户不必等待特定公司中所有用户在 CustomFieldValue 表中完成插入或删除操作。
    • 缺点是开发人员必须确保相关的 CustomFields 显示在前端,即使 CustomFieldValue 表中还没有相关记录。
    • 在最终用户每次更新自定义字段输入时,开发人员必须首先检查相应的 CustomFieldValue 行是否存在,如果存在 - 存储更新的值,如果不存在 - 创建 CustomFieldValue 行。

请提出一种高效且易于维护的解决方案。

标签: sqlsql-servertsql

解决方案


推荐阅读