Sql 用于成员资格应用程序的自定义字段数据库设计

Sql 用于成员资格应用程序的自定义字段数据库设计,sql,database-design,Sql,Database Design,我需要设计一个会员申请,需要为多个组织自定义分类数据库 以下是数据集: 组织类型1: 姓名、电子邮件、加入年份、年终、角色、地点 组织类型2: 姓名、电子邮件、加入年份、年终、角色、部门、子组织、位置 组织类型3: 姓名、电子邮件、加入年份、年终、角色、识别号 为它设计数据库的最佳方法是什么? 很少有字段项是通用的,很少有特定于组织的,组织类型有限 备选案文1: 成员表-成员id、姓名、电子邮件、加入年份、结束年份、角色 成员组织类型1-成员id,位置 成员组织类型2-成员id、部门

我需要设计一个会员申请,需要为多个组织自定义分类数据库

以下是数据集:

  • 组织类型1: 姓名、电子邮件、加入年份、年终、角色、地点

  • 组织类型2: 姓名、电子邮件、加入年份、年终、角色、部门、子组织、位置

  • 组织类型3: 姓名、电子邮件、加入年份、年终、角色、识别号

为它设计数据库的最佳方法是什么? 很少有字段项是通用的,很少有特定于组织的,组织类型有限

备选案文1:
  • 成员表-成员id、姓名、电子邮件、加入年份、结束年份、角色
  • 成员组织类型1-成员id,位置
  • 成员组织类型2-成员id、部门、子组织、位置
  • 成员组织类型3-成员id、id号
选择:2
  • 成员表-成员id、姓名、电子邮件、加入年份、结束年份、角色
  • 成员字段-成员id、字段类型、字段值
  • 字段标签-字段类型,字段标签

第二种类型看起来很有希望,但不知道如何将成员表和成员字段与必填字段进行联接操作?

如果组织类型有限且很少更改,只需使用一个表:

  • 成员表-成员id、姓名、电子邮件、加入年份、结束年份、角色、位置、部门、子组织、id号
在与组织类型无关的字段中使用空值,并在显示信息时隐藏不适用的字段


我给出了一个类似的答案,尽管它是针对不同的数据库。

这是数据库设计中的一个常见问题,有3种最常见的处理方法(如果我们计算EAV,则有4种):

  • 三个单独的表格,每种类型一个

  • 一个表-有很多列-其中一些将被允许有空值。数据库无法轻松处理完整性(哪些列组合为空,哪些不为空),通常由应用程序处理。这就是@noa的答案,它的结果是代码稍微少一些,并且可能更容易开发出一个工作(尽管不是完美)的应用程序

  • 一个
    成员
    表(这是超类型)和三个附加表,每个子类型一个。这允许您不使用空值,并根据组织类型强制使用哪些列。(这是您的选项1)

  • 您还可以在所有表中添加一个
    org\u type
    列。这将意味着 对
    成员(组织类型,成员ID)
    的附加
    唯一
    约束和
    外键
    约束(来自每个子类型表)更改为包含此
    组织类型
    列。大概是这样的:

        CREATE TABLE Member
        ( MemberID 
        , Org_Type
        , Name
        , ...
        , Role
        , PRIMARY KEY (MemberID)
        , UNIQUE KEY (Org_Type, MemberID)
        , CHECK Org_Type IN (1, 2, 3)
        ) ;
    
        CREATE TABLE Member_Type_1
        ( MemberID 
        , Org_Type
        , Location
        , PRIMARY KEY (MemberID)
        , FOREIGN KEY (Org_Type, MemberID)
            REFERENCES Member(Org_Type, MemberID) 
        , CHECK Org_Type = 1
        ) ;
    
    and finally there's (your option 2) EAV:
    
  • 根据维基百科,模型是:
  • 用于描述实体的数据模型,其中可用于描述实体的属性(属性、参数)数量可能很大,但实际应用于给定实体的数量相对较少。在数学上,这种模型称为稀疏矩阵。EAV也称为对象-属性-值模型、垂直数据库模型和开放模式

    在关系数据库中不使用EAV的原因有很多,主要是因为数据类型和引用完整性方面的问题(这不容易实现)、编写简单查询的困难(最终编写了大量连接)和效率。请参见DBA.SE上Simon Righarts的回答问题:

    但是,正如亚伦·伯特兰(Aaron Bertrand)的文章所解释的那样,在某些情况下,这是一个有效的选择,这是有原因的,特别是当你有很多列的时候,甚至当你事先不知道你需要什么列(由客户定制)的时候。如果您希望组织能够添加自定义列,那么这可能就是您的情况


    但是请注意,构建一个高效的EAV模型/应用程序并不容易。实际上,您正在数据库中构建RDBMS。

    请尝试第一个选项。无需干扰EAV(这是第二个选项的名称)@ypercube请帮助我理解其中的区别,哪一个更有效,现在,第二个选项看起来更灵活阅读关于选项2的内容:(这主要是反对它的观点)。下面是“赞成”的观点(别被标题弄糊涂了,它解释了为什么和什么时候可以使用):谢谢,我会研究它们。这会增加很多列的数量,因为每个组织类型的列都很多。同意。没有足够的特定字段来保证拆分。我唯一能建议的是添加一个“组织类型”字段,以便能够轻松筛选结果。然后,您可以使用触发器确保根据类型填写适当的字段,或者在应该填写的时候保持为空。@Masade您只说了4个额外的列。最坏的情况是3个为空;最好的情况是1个为空。最坏的情况是4个为空,最好的情况是2个为空。@ypercube用于组织类型E2,只有“标识号”为空。