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

标签 mysql database-design dynamic dynamic-data field

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

规则:

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

特殊规则:

  1. 用户每天最多可以提交 5 次表单
  2. 值的日期很重要
  3. 报告值的灵 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/

相关文章:

php - 如何安全抵御 XSS 攻击但允许 <br>

mysql - 请帮助使用MySQL来选择要写入的数据需要一个select语句而要创建的记录需要另一个

ruby-on-rails - 销售点和库存数据库架构

dynamic - 如何将按钮添加到现有的UIActionSheet?

php - 如何在搜索引擎上添加自动完成功能

java - Grails 找不到能够从类型 [java.lang.Long] 转换为类型 [User] 的转换器

c# - 如何在 Entity Framework 中处理这种层次结构

database - 多个实体的通用一对多表

c# - 在动态对象上调用方法基本上都是 GetMethod().Invoke() 吗?

dynamic - 如何区分 .data.rel 部分中的可重定位符号和不可重定位符号