2

我需要为需要为多个组织自定义分类的会员应用程序设计数据库

以下是数据集:

  • 组织类型 1:姓名、电子邮件、入职年份、结束年份、角色、位置。

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

  • 组织类型 3:姓名、邮箱、入职年份、结束年份、角色、身份证号。

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

选项1:

  • members_table - member_id、姓名、电子邮件、join_year、end_year、角色
  • members_org_type_1 - member_id,位置
  • members_org_type_2 - member_id、部门、sub_org、位置
  • members_org_type_3 - member_id, id_no

选项:2

  • members_table - member_id、姓名、电子邮件、join_year、end_year、角色
  • member_fields - member_id、field_type、field_value
  • field_labels - field_type,field_label

第二种类型看起来很有希望,但不知道如何使用必填字段进行连接操作 members_table 和 member_fields?

4

2 回答 2

4

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

  1. 三个单独的表,每种类型一个。

  2. 一张表 - 有很多列 - 其中一些将被允许有空值。数据库不容易处理完整性(哪些列组合将为 Null,哪些不是),通常由应用程序处理。这是@noa 的答案,它会导致代码稍微少一些,并且可能更容易提出一个工作(虽然不完美)的应用程序。

  3. 一个Member表(这是超类型)和 3 个附加表,每个子类型一个。这允许您没有 Null,并根据组织类型强制使用哪些列。(这是您的选项 1)

您还可以org_type在所有表​​中添加一列。这将意味着一个额外的UNIQUE约束,Member (org_type, member_ID)并且FOREIGN KEY约束(来自每个子类型表)被更改为包含该org_type列。像这样的东西:

    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:
  1. 根据维基百科,实体-属性-值模型是:

用于描述实体的数据模型,其中可用于描述它们的属性(属性、参数)的数量可能很大,但实际应用于给定实体的数量相对较少。在数学中,这个模型被称为稀疏矩阵。EAV 也称为对象-属性-值模型、垂直数据库模型和开放模式。

在关系数据库中不使用 EAV 的原因有很多,主要是因为数据类型和引用完整性方面的问题(不能轻易实施)、即使是简单的查询也难以编写(最终会编写很多连接)和效率。请参阅 Simon Righarts 在 DBA.SE 问题上的回答:此数据库结构有名称吗?

不过,在某些情况下它是一个有效的选择是有原因的,正如 Aaron Bertrand 的文章所解释的那样:EAV 到底有什么不好的地方?,尤其是当您有很多列时,甚至在您事先不知道需要哪些列时(客户定制)。如果您希望组织能够添加自定义列,那可能就是您的情况。

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

于 2012-07-14T17:33:41.550 回答
2

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

  • members_table - member_id、姓名、电子邮件、join_year、end_year、角色、位置、部门、sub_org、id_no

在与组织类型无关的字段中使用空值,并在呈现信息时隐藏不适用的字段。

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

于 2012-07-14T16:31:31.793 回答