Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
评论我的MySQL数据库设计中的无限动态字段_Mysql_Database Design_Dynamic_Dynamic Data_Field - Fatal编程技术网

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

评论我的MySQL数据库设计中的无限动态字段,mysql,database-design,dynamic,dynamic-data,field,Mysql,Database Design,Dynamic,Dynamic Data,Field,寻找一个可扩展的,灵活的和快速的数据库设计为“建立自己的形式”风格的网站-例如 规则: 用户只能生成一个表单 用户可以创建自己的字段或从“标准”字段中进行选择 用户的1表单具有用户所需的任意多个字段 值可以是另一个值的同级值,例如照片值可以具有名称、位置、宽度和高度作为同级值 特别规则: 用户每天最多可以提交5次表单 值的日期很重要 报告值的灵活性(对于单个用户、所有用户、1个字段、多个字段)非常重要——数据可视化(大多数将按时间顺序进行,例如,所有用户2009年7月的所有照片) 表格“用户”

寻找一个可扩展的,灵活的和快速的数据库设计为“建立自己的形式”风格的网站-例如

规则:

  • 用户只能生成一个表单
  • 用户可以创建自己的字段或从“标准”字段中进行选择
  • 用户的1表单具有用户所需的任意多个字段
  • 值可以是另一个值的同级值,例如照片值可以具有名称、位置、宽度和高度作为同级值
  • 特别规则:

  • 用户每天最多可以提交5次表单
  • 值的日期很重要
  • 报告值的灵活性(对于单个用户、所有用户、1个字段、多个字段)非常重要——数据可视化(大多数将按时间顺序进行,例如,所有用户2009年7月的所有照片) 表格“用户”

    液体

    表格“字段\用户”将字段分配给用户表单

    氢火焰离子化检测器

    液体

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

    表格“字段”

    氢火焰离子化检测器

    creator\u uid-int-字段“creator”

    标签-varchar-例如电子邮件

    value_type-varchar-用于确定填写“values”表中的哪个字段(例如,如果为“int”,则此字段的值将向values.type_int字段提交数据-所有其他.type_x字段将为空)

    字段类型-varchar-例如“电子邮件”-用于特殊条件,例如验证规则

    表格“值”

    视频

    父母

    氢火焰离子化检测器

    液体

    日期-日期

    日期组-整数-值1-5(用户每天最多可提交5份表格)

    类型_varchar-varchar

    键入文本-文本

    类型_int-int

    类型\浮点数-浮点数

    类型_bool-bool

    类型\日期-日期

    类型\时间戳-时间戳

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

    昨天,Josh Berkus给了一个关于DB设计的很好的教程,他花了很大一部分时间无情地撕碎了这样的“il表”;你应该很快就能在OSCON网站上找到他的幻灯片,并最终在网上找到他整个教程的录音(后者可能需要一段时间)

    每个属性都需要一个连接(多个
    值表的实例,每个正在获取或更新的属性一个),所以我不知道“少连接表”是什么意思。连接同一个表的多个实例并不是一个特别快的操作,而且您的设计使得索引几乎不可行且不可用


    至少作为一个小小的改进,为属性的值使用每种类型的单独表(在这种情况下可能会使用一些索引,尽管MySQL的限制是每个表每个查询一个索引,尽管这有点可疑)。

    您应该真正研究无模式的数据库,比如,像这样的问题正是这些类型的数据库想要解决的。

    在许多现代rdbms实现中,您可以在运行时执行创建表、更改、添加列等操作。为什么是埃维尔?尤其是当您使用动态sql时

    这不是给胆小鬼的。我记得波音公司的一个实现,它在一个数据库中生成了70000个表


    显然,动态表创建中存在缺陷,但EAV表也存在缺陷。例如,同一个键的两个属性表示相同的事实。或可传递依赖项和其他规范化问题。那么,为什么不至少代表您利用RDBMS的力量呢?

    我同意约翰·欧文的观点

    与查询EVA表相比,从模式动态创建查询的代价很小。尤其是如果桌子很大的话


    通常,表列被视为“接口”。依赖于动态变化的接口的设计通常是不好的,但EAV数据是一种特殊情况,在这种情况下,您没有很多选择。您必须在慢速非直观查询和动态模式之间进行选择。

    感谢您提供了指向OSCON和EAV的链接。Josh是否为EAV'il数据库场景提出了另一种数据库设计方案?在SQL中没有真正好的方法实现“完全灵活的模式”,请参阅许多PGExpert演示文稿的幻灯片链接,包括OSCON 09演示文稿(“有效的数据库”也应该有一些内容);EBlob本质上是另一种选择,当然它也有很多问题(不同于EAVil)。。。我可以试着用MySQL从一个圆圈中挤出一个正方形,但这是我的选择。不过CouchDB看起来确实很有趣,谢谢你的提示;-)