单个大型v / s多个小型MySQL表,用于存储选项

时间:2010-05-30 05:19:08

标签: mysql database optimization

我知道有关此问题的论坛有几个问题。但我不是在谈论为同一个实体(例如用户)分割表格

假设我有一个巨大的选项表,用于存储列表选项,如性别,婚姻状况,以及更多具有相同结构的特定于域的组。我计划在OPTIONS表中捕获。 另一个简单的选择是将字段设置为ENUM,但也有缺点。 http://www.brandonsavage.net/why-you-should-replace-enum-with-something-else/

OPTIONS表:

option_id <will be referred instead of the name>
name
value <more like a description, and not a name/value pair>
group

查询:select .. from options where group = '15'

用法:性别&amp; Marital_Status将出现在人员表中;但是存储的值将来自Options

    eg. 
    Person 
    ..
    id=34 name=Prasad gender=31 marital_status=41
    .. 

    Options
    .. 
    31 gender male male
    32 gender female female
    ...
    41 marital_status single single 
    42 marital_status married married
    ..
  • 由于此表预计是多租户,因此行数不会急剧增加。
  • 我认为拆分表而不是通过小组查找会更容易编写&amp;更快执行。
  • 或者可能是由小组或租户划分?

2 个答案:

答案 0 :(得分:1)

这基本上是EAV model,其中包含所有优点和缺点。

EAV模型用于可用于描述事物(“实体”或“对象”)的属性(属性,参数)数量可能很大的情况,但实际应用于给定的实体相对适中。它也被称为“稀疏矩阵”。

适当使用EAV表的一个很好的例子是医学数据库中的症状。虽然可能存在数千种可能的症状,但普通人去看医生的症状只会少得多。

Wikipedia article about EAV应告诉您此模型是否适合您的特定应用,并建议一些这方面的最佳做法。

请注意,如果您的示例列是性别和婚姻状态,并且您有一个Persons表,那么这些列更适合属于Persons表,而不是EAV表。

答案 1 :(得分:1)

我工作的系统有这个精确的问题。它在医疗保健领域。

我们有一些标准化的代码表,如性别(明显)和患者状态(住院,门诊,急诊,观察,预备)。我们将每个作为一个单独的小表处理。这些表格内容很小且相当静态,不需要太多维护。因此,在这些情况下,我们拥有使表格变得微小的效率,并支付各种各样的成本。

但是我们也有一些表格,其价值由我们的医院客户提供给我们,例如宗教,近亲关系(女儿,父亲等)。我们还在这张表中处理诊断,因为医院有不同的编码方式,而且它们不断扩展。 *当我们将新的医院客户添加到我们的系统中,以及这些医院遇到新问题时,这些表通常会在其中获得新值。

这些表格中的值以及我们需要保留的表格类型都反映了人类生活的多样性,以及我们医院的客户经常发现患者的新事物。在这种情况下,将所有这些代码保存在一个参考表中是有意义的。每个条目都有一个id。我们还分配客户ID和代码类型(例如宗教,诊断),代码名称(例如PROT,CATH,BUDD)和代码值(例如新教徒,天主教徒,佛教徒)。最后,我们添加了一个优先级,让我们可以控制应用程序中的选项列表顺序。

在这种情况下,单个大型表的效率命中被我们可以拥有一个代码库来维护该表以及统一的用户界面这一事实所抵消。

请勿在此代码表中列出人名或任何其他潜在机密信息,除非您希望在将来某个时候在很多压力下处理复杂的安全问题。

如果您在医疗保健IT部门工作,您最好弄清楚您将对ICD-9和ICD-10诊断代码做些什么。转换即将到来,这并不容易。

祝你好运