我有一个拥有超过100K记录的数据库。 很多类别和很多项目(每个类别有不同的属性) 一切都存储在EAV中。
如果我试图打破这个方案并为任何类别创建一个唯一的表 是我必须要避免的事情吗?
是的,我知道我可能会有很多桌子,我需要改变它们 如果我想添加一个额外的字段,但这是错的吗?
我还读过我所拥有的表,db将填充更多文件 这对任何文件系统都不好。
有什么建议吗?
答案 0 :(得分:8)
作为数据库设计中的主要结构,随着数据的增长,结构将失败。您知道数据库模式不适合业务模型的方式是您需要对其进行查询以进行报告。 EAV需要许多变通方法和非本机数据库功能才能获得合理的报告。即,即使是最小的查询,您也不断创建交叉表/数据透视查询。所有处理EAV并将其置于可查询格式的处理都会咀嚼CPU周期并且非常容易出错。此外,数据的大小在几何上增长。如果您有10个属性,则标准设计中的10行将生成100个EAV行。 100个标准行将等于1000个EAV行,依此类推。
数据库管理系统旨在处理大量表格,这应该不用担心。
可以创建一个混合解决方案,其中EAV结构是解决方案的部分。但是,规则必须是您永远不能包含查询[AttributeCol] = 'Attribute'
。即,您永远不能过滤,排序,限制任何属性的范围。您无法在报表或屏幕上的任何位置放置特定属性。它只是一小撮数据。结合系统其余部分的良好模式,拥有存储数据blob的EAV非常有用。实现这项工作的关键是在您自己之间执行,开发人员永远不要跨越属性的过滤或排序。一旦你沿着黑暗的道路前进,它将永远支配你的命运。
答案 1 :(得分:4)
有用于运行EAV模型的数据库引擎。我不认识他们所以我不推荐一个。但是将EAV模型推入关系引擎是一种灾难。灾难将会发生,这只是时间问题。
您的数据可能会保持足够小,并且您的查询足够简单,但这种情况很少发生。
答案 2 :(得分:3)
EAV数据库架构非常灵活,可以添加更多关系数据库的“列”,但代价是会降低查询性能并丢失保留在关系数据库架构中的业务逻辑。
因为您必须创建多个视图才能实际转动结果,如果表包含数十亿行,则会导致性能问题。 EAV模式的另一个特性是,当您将数据表与元数据表连接时,总是会进行查询,并且同一数据表上可能存在多个连接。
这是基于我的经验。
答案 3 :(得分:3)
我在大约4年前为电子学习而建立的创作系统上采用了这种方法。我当时并不知道我在做EAV,但我认为我只是使用名称/值类型对狡猾。我认为我的记录增加了,但重新设计的次数减少了,因为每当我们收到更改请求时,我都非常厌倦将列调整到左侧。
我做了第一次测试,在一个表中构建了系统的层次结构。多数民众赞成在大约4个项目,25个产品和4到5个工具中表现出色,每个工具都通过层级整数分配回链接到主键。
我一直在录制通过系统的资产,这意味着FLV文件,SWF,JPG,PNG,GIF,PDF,MP3等......以及所有关于它们的mime类型细节。每个文件的范围仅为4到10个属性。它总计高达800万“资产数据”记录,其中我们有大约80万资产(est)。 我有一个请求将所有信息放入报告的列中。 SQL语句必须自己进行多个表连接,更不用说如果他们想知道它所使用的内容,产品或项目只是一大堆JOIN的事实。
从粒度的角度来看效果很好。从Excel报告的角度来看,系好安全带。我通过在报表中按照人们想要的方式对数据执行快照来缓解它,但需要一段时间来编译需要我卸载(SQL Dump)到另一台服务器的信息。
我发现自己在询问这是否是正确的事情,对于这个项目,我可以说这个要求大规模报告“是”。但它让服务器出汗相当糟糕。真的取决于他们的深层次查询。
自从我从2002年开始涉足SQL并将其用于支持工具以来,它没有大规模存活。如果它是一个更大的百万人,太字节+数据库,我可能会把我的头发拉出来。
特别提示:我发现这个系统在RedHat上,它是32位。许多PHP处理线程无法在超过1个CPU内核上运行,并且服务器还有7个内核处于空闲状态!在这台机器上运行最多需要45分钟的查询,实际上可以在正确配置的64位系统上运行14-25秒。在考虑表现时也值得深思。