【问题标题】:Abstract databases design.抽象数据库设计。
【发布时间】:2015-12-14 22:36:04
【问题描述】:

所以我正在创建一个具有不同用户类型的网络应用程序,这些用户类型可能来自不同的国家。用户类型的示例为 companystaff 等。其中公司将拥有 company_name 字段,而员工则没有。

users 数据库中,我想知道实现每列一个表的方法是否是个好主意,即对于每个用户属性,都会有一个带有外键的表,即user_id 和@ 987654327@为属性值。

例如。 users.company_name = id(PK), | user_id(FK) | 'company_name' 1 | 1 | company 1

users.email = id(PK), | user_id(FK) | 'email' 1 | 1 | user@email.com

同样可以应用于address 数据库,其中不同国家的地址具有不同的值。

意见?

【问题讨论】:

  • 我会说不。请考虑您需要编写的查询
  • 没办法。此时您不妨使用单个 eav 表
  • 我不同意 eav 表,因为无法为不同的字段设置正确的数据类型
  • 我试图解释一般的数据库设计。如果你喜欢,你可以通过这个例子:stackoverflow.com/questions/32190581/normalization-in-database/…

标签: mysql database


【解决方案1】:

您要查找的词是“The Party Model

您想使用表继承†(也称为subtype/supertype 关系)对此类内容进行建模。

个人是抽象法律方的具体化。组织(例如公司)也是抽象法律方的实体。

“员工”不是法律方的子类型。这是公司和个人之间的关系。一家公司有很多员工与个人的关系。

我推荐Single Table Inheritance,因为它既快速又简单。如果你真的不喜欢空值,那就去Class Table Inheritance

create table parties (
  party_id int primary key,
  type smallint not null references party_types(party_type_id), --elided,
  individual_name text null,
  company_name text null,

  /* use check constraints for type vs individual/company values */
);

如果您要使用单表继承,我会使用 PostgreSQL 而不是 MySQL(或 MariaDB),因为后者不支持检查约束。

您可以让user 属于party,或者让派对拥有一个user

† 这与 PostgreSQL 的继承功能不同。

【讨论】:

    【解决方案2】:

    我将创建一个包含 company_nameemail 列的单个用户表。

    对于地址表,我将从以下简单的内容开始:id、address_line_1、address_line_2、city、state、country、zip。

    【讨论】:

    • 这两种表格设计的问题是每个用户都没有company_name,同样不同的国家有不同的address格式。
    • 那么问题出在哪里?这些字段可以保持为空
    【解决方案3】:

    使用此策略,您必须执行大量连接表才能获得有意义的查询结果。因此,您的性能将受到影响,并且您对存储的使用效率非常低。

    您至少应该组合通常会为应用程序中的逻辑实体组合的列。因此,如果“公司”与“员工”的不同之处在于它有额外的列,那么您将创建一个表“users.company_properties”。

    【讨论】:

      猜你喜欢
      • 2018-09-05
      • 2011-03-17
      • 2012-01-04
      • 1970-01-01
      • 2017-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多