具有通用字段的大表作为EAV和关系表的替代

时间:2014-08-31 18:41:53

标签: mysql sql database entity-attribute-value

以下数据库设计可能发生的最坏情况是什么?马上或将来?*

我正在编写我的微型MF,我正在考虑使用以下架构进行数据库。将来所有模块都将使用。我必须使用MySQL。我隐瞒了原因和解释,以便有人不会通过说它是基于意见的来解决问题,就像之前发生的那样。让我们说这就是我手中的问题,这是我必须使用的解决方案。话虽如此:

Main Table
-------------------

primary_key   data_type   field1   field2   field3   field4   field5   field6   field7 
-----------   ---------   ------   ------   ------   ------   ------   ------   ------ 

Attribute Table 1
-------------------

attribute_key1   primary_key   attribute_name   field1   field2   field3   field4   field5   field6   field7
--------------   -----------   --------------   ------   ------   ------   ------   ------   ------   ------

Attribute Table 2
-------------------

attribute_key2   primary_key   attribute_name   field1   field2   field3   field4   field5   field6   field7
--------------   -----------   --------------   ------   ------   ------   ------   ------   ------   ------

Attribute Table 3
-------------------

attribute_key3   primary_key   attribute_name   field1   field2   field3   field4   field5   field6   field7
--------------   -----------   --------------   ------   ------   ------   ------   ------   ------   ------

每个表的属性键可以相互引入。

字段类型可以以任何适当的格式展开;也许其中有两个是longtext,其中一个是bigint,或者其中一个是tinyint,其中一个是varchar。

data_type是数据类型的唯一标识符。说,博客帖子。 primary_key是主标识的键(在树顶部)。属性与主标识相关,并通过primary_key附加到标识。

作为模块开发人员如何使用它的示例,使用简单的示例 - 使用PHP:

  • 定义一个表达数据模型并将其映射到编码器可读字段的数组:

    $ var [' models'] [' module_name'] [' blog_post'] = 阵列(       ' maintable' = GT;阵列('

            'primary_key' => 'post_id',
            'blog_post' => 'data_type',
            'title' => 'field1'
      '),
      'attribute_table1' => array(
    
             'attribute_key1' => 'category_id',
             'primary_key' => 'post_id',
             'field1' => 'tag'
    
      ),
    

    );

有了这个,模块开发人员定义了一个' blog_post'数据模型,包括帖子ID,标题和附加标签,跨越两个表格。属于模块' module_name'。

从那时起,如果我们说module_name是博客,那么dev需要做什么才能访问这个数据对象:

$ data_access-> GET_DATA('博客'' blog_post',POST_ID);

(模块名称,型号名称,数据ID)

1 个答案:

答案 0 :(得分:1)

我建议使用EAV的混合方法 - 将公共字段放入每个实体的表格中,然后将EAV用于不常见的字段。

您的方法的主要缺点是数据本身不是自我记录的 - 您不知道它意味着什么。将来,这意味着您必须将所有元数据信息作为附加表进行开发,最终您将获得只有您理解的应用程序。对于常规关系表,表和列名称是描述性的。使用EAV方法,属性名称与值一起存储。

其他缺点:

  • 您无法实现索引以加快特定元素的访问速度。
  • 属性的给定值可以在任何列中,这样很难获得“整体视图”。
  • 您没有使用关系数据库的强大功能。
  • 您无法在表格之间定义外键关系。