为“构建您自己的表单”风格的网站寻找可扩展、灵活且快速的数据库设计 - 例如 Wufoo .
规则:
- 用户只能构建 1 个表单
- 用户可以创建自己的字段或从“标准”字段中进行选择
- 用户 1 的表单有用户想要的字段数
- 值可以是另一个值的兄弟值,例如照片值可以将名称、位置、宽度、高度作为兄弟值
特殊规则:
- 用户每天最多可以提交 5 次表单
- 值的日期很重要
- 报告值的灵 active (针对单个用户、跨所有用户、1 个字段、多个字段)非常重要 - 数据可视化(大多数将按时间顺序排列,例如所有用户 2009 年 7 月的所有照片)。
表“用户”
用户标识符
表“field_user” - 将字段分配给用户表单
发现
用户标识符
weight - int - 用于对用户表单上的字段进行排序
表“字段”
发现
creator_uid - int - “创建者”字段
标签 - varchar - 例如邮箱
value_type - varchar - 用于确定“值”表中的哪个字段将被填充(例如,如果为“int”,则该字段的值将向 values.type_int 字段提交数据 - 并且所有其他 .type_x 字段将为 NULL)。
field_type - varchar - 例如'email' - 用于特殊情况,例如验证规则
表“值”
视频
父视频
发现
用户标识符
日期 - 日期
date_group - int - 值 1-5(用户每天最多可以提交 5 个表单)
type_varchar - varchar
type_text - 文本
type_int - 整数
type_float - float
type_bool - bool
type_date - 日期
type_timestamp - 时间戳
我知道这种方法意味着“值”表中的记录将只有 1 条数据和其他包含 NULL 的 .type_x 字段......但根据我的理解,这种设计将是“最快”的解决方案(更少的查询, 少连接表)
最佳答案
在 OSCON昨天,Josh Berkus 给出了一个关于数据库设计的很好的教程,他花了很大一部分时间无情地撕毁了这样的“EAV”il 表;您应该很快就能在 OSCON 网站上找到他的幻灯片,并最终可以在线找到他整个教程的录音(后者可能需要一段时间)。
每个属性都需要一个连接(values
表的多个实例,您正在获取或更新的每个属性一个)所以我不知道您所说的“较少连接表”是什么意思”。连接同一个表的多个实例并不是一个特别快的操作,而且您的设计使索引几乎不可行且不可用。
至少作为一个小的改进,为您的属性值使用每个类型的单独表(也许某些索引可能适用于这种情况,尽管 MySQL 限制每个表每个查询一个索引,即使这有点可疑)。
关于mysql - 批评我的 MySQL 数据库设计无限动态字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1159932/