批评我的无限动态字段的MySQL数据库设计

Chr*_*cob 3 mysql database-design field dynamic dynamic-data

为"构建您自己的表单"风格的网站寻找可扩展,灵活和快速的数据库设计 - 例如Wufoo.

规则:

  1. 用户只有1个可以构建的表单
  2. 用户可以创建自己的字段或从"标准"字段中选择
  3. 用户1表单包含用户想要的字段数
  4. 值可以是另一个值的兄弟.例如,照片值可以具有名称,位置,宽度,高度作为兄弟值

特别规则:

  1. 用户每天最多可以提交5次表格
  2. 价值日期很重要
  3. 报告值的灵活性(对于单个用户,跨所有用户,1个字段,许多字段)非常重要 - 数据可视化(大多数将基于时间顺序,例如所有用户的2009年7月的所有照片).

表"用户"

UID

表"field_user" - 将字段分配给用户表单

瞎话

UID

weight - int - 用于对用户表单上的字段进行排序

表"字段"

瞎话

creator_uid - int - 字段'creator'

label - varchar - 例如电子邮件

value_type - varchar - 用于确定将填充'values'表中的哪个字段(例如,如果'int',则此字段的值将数据提交到values.type_int字段中 - 并且所有其他.type_x字段将为NULL) .

field_type - varchar - 例如'email' - 用于特殊条件,例如验证规则

表"值"

VID

parent_vid

瞎话

UID

日期 - 日期

date_group - int - 值1-5(用户每天最多可提交5个表格)

type_varchar - varchar

type_text - 文本

type_int - int

type_float - float

type_bool - bool

type_date - 日期

type_timestamp - 时间戳

据我所知,这种方法意味着'Value'表中的记录只有1个数据,其他.type_x字段包含NULL ...但从我的理解,这个设计将是'最快的'解决方案(更少的查询,更少的连接)表)

Ale*_*lli 5

OSCON昨天,Josh Berkus提供了一个关于数据库设计的好教程,他花了很多时间无情地撕裂了这样的" EAV "表.你应该很快就能在OSCON网站上找到他的幻灯片,并最终在线录制他的整个教程(后者可能需要一段时间).

你需要一个每个属性的连接(values表的多个实例,你正在获取或更新的每个属性一个)所以我不知道你的意思是"少连接表".加入同一个表的许多实例并不是一个特别快的操作,并且您的设计使索引几乎不可行且无法使用.

至少作为一个小的改进,使用每个类型的单独的表来表示你的属性值(也许某些索引可能适用于那种情况,尽管MySQL限制为每个查询每个查询一个索引,即使这有点可疑).