我们的数据库是基于EAV(实体 - 属性 - 值)模型设计的.那些使用EAV模型的人知道为了灵活性而附带的所有垃圾.
我向我的客户询问了使用EAV模型的原因(灵活性),他们的反应是:他们的实体随着时间而变化.因此,今天他们可能有一个具有一些属性的表,但在一个月的时间内,可能会添加一些新属性,或者可能会重命名现有属性.他们需要生成报告以回到任何阶段,并根据该阶段的实体形状查询数据.
我理解这对于传统的关系模型是不可行的,但我个人认为EAV是反模式的.是否有其他替代模型使我们能够捕获实体和实例更改的时间维度?
干杯,莫什
database database-design data-modeling entity-attribute-value data-structures
我在这里读到了关于5NF,EAV和6NF的讨论,以及需要一个目录来"自动"处理元数据和复杂的SQL.这是如何在实践中实施的?
PerformanceDBA在提到目录的6NF和EAV上写了几个答案,例如在以下问题中:
特别是多个固定表与灵活的抽象表,PerformanceDBA写的
"例如,对于6NF数据库与目录,我有一组特效,将[重新]产生执行所有根据需要选择SQL,我提供5NF为所有用户意见,所以他们不需要知道或了解的基础6NF结构.它们被驱逐出目录.因此变化很容易并且自动化.由于缺少目录,EAV类型手动完成."
sql database-design schema-design entity-attribute-value database-normalization
找到一个完美,灵活的模式,用于存储许多不同类型的对象,在关系数据库中它们之间具有各种各样的链接.
EAV是RDBMS正常限制的一种解决方法.
如果你要规范化EAV架构,那将是丑陋的.
如果EAV正常化,那将是丑陋的.
我们传统上手工维护这些架构的事实是否限制了它们的复杂性和功能?
但如果以编程方式维护和查询,那有什么关系呢?
如果n在n不同的表中有不同的实体,为什么不让代码生成n(n+1)/2链接表以及它们之间的查询?这不会导致规范化架构中的真实图形吗?
在高度相互关联的数据库中,总是会有比指数更多的边缘.为什么不专注于创建正确的标准化Verticle(n实体表)并让我们的代码保持边缘(n^x链接表)?
系统能否规范化EAV并维护最终的复杂模式?
复杂的图形可以存储在(并保持真实)关系数据库中吗?
我确信之前已经完成了,但我从未见过它.我错过了什么?
存储印刷品及其书目数据
" 你想解决什么问题? " -
皮特
我正在寻找关系数据库系统中EAV,图形和多态关系的规范化解决方案.
" 我不愿意成为那些在投入生产后必须理解或维护它的人. " -
安德鲁
这种"传统维护"正是我所说的应该是自动化的.这不是很大的咕噜声吗?
language-agnostic database-design graph relational-database data-structures
我需要存储一组实体,其中有几个专用版本.它们具有一些共同属性,但专用属性包含特定于该实体的属性.
数据存储是一个关系型DBMS,这不是讨论:-)具体来说,它是Microsoft SQL Server 2005.
我可以轻松地为公共属性创建一个表,然后为每个专用版本创建一个表.但是,以后可能需要将新实体添加到解决方案中,并且我不希望同时维护对象模型和数据库模式.
另一个想法是创建一个表
reading(<common properties>, extended_properties)
Run Code Online (Sandbox Code Playgroud)
并且该extended_properties字段是扩展属性的某种序列化.我在想JSON或XML.我很可能会使用ORM框架,但我还没有决定.无论哪种方式,来自的专用实体的对象表示都reading可以公开{extended_property_name, value}包含来自该extended_properties字段的解析的键/值对的字典.
从这个http://msdn.microsoft.com/en-us/library/ms345117(SQL.90).aspx我收集XML字段,结合这些的模式,在DBMS中给出了类型化XML的概念.此外,涉及extended_properties字段中的XML内容的查询也可以考虑这些.
对我的解决方案建议的反馈,主要是具有reading扩展属性的表和序列化的建议.
此外,我意识到这是关系DBMS与基于键/值的商店相比的局限性之一.但是,肯定必须有一些建模技术来适应这种情况.
非常感谢任何反馈!
让我们从背景开始.
我需要具有基本信息的用户个人资料,如姓名,电子邮件,电话等.为此,我有一个实体用户.
我还需要存储调查问卷的答案.我想将它们作为文本字段中的json存储在数据库中.这些问题将来可能会发生变化,目前有大约30个问题,所以我不想将其存储为实体.所以目前在我的用户实体中我有这个:
/**
* @var array
*
* @ORM\Column(name="questionnaire", type="json_array", nullable=true)
*/
private $questionnaire;
Run Code Online (Sandbox Code Playgroud)
我知道Symfony会处理json_encode/json_decode的事情.所以这很棒.
但是现在,我在使用symfony构建器创建表单时遇到了一些问题.
首先,我想我可以尝试这样的事情:
$builder->add('questionnaire[source]');
Run Code Online (Sandbox Code Playgroud)
哪个不起作用.对于symfony大师来说,我知道这很明显; o)
所以我目前的选择是:CollectionType或Data Transformers.
从我看到,CollectionType将无法工作,因为它只适用于数字数组,其中我们有一些JS"添加另一行"或其他东西.http://symfony.com/doc/current/reference/forms/types/collection.html#adding-and-removing-items但如果我对此错了,我应该选择CollectionType并且有一些神奇的方法请告诉我.我找不到这个.
所以我在考虑使用Data Transformers或者只是在没有这个Transformer的情况下在提交时创建一个数组.使用"mapped => false"创建问卷调查中的所有字段,然后将这些提交的值设置为$ questionnaire的关联数组.这种"感觉"还可以,但我不知道如何在"编辑"表单中处理这个问题(从我想到的文档http://symfony.com/doc/current/reference/forms/types/form.html #data).
问卷调查本身将有许多ChoiceType字段,一个CollectionType与"添加更多行"等等,它将有很多问题.所以它会有点复杂.我想避免为每个问题作为一个属性创建实体(不确定它是否是一个正确的选择,但考虑到我认为它是最好的一切).
这是我与symfony的第一次约会,所以任何帮助/小贴士都会欣赏.
我一直在为即将开展的项目进行大量的数据库设计研究.
这是典型的内部平台的问题,我们的客户基本上要无限定制和打造产品的能力和对实体属性,收集他们从最终用户的价值,并能够显示在图形上收集到的信息.
临床医生将用它来帮助监测患者,为什么即使使用EAV,我们也需要为不同的试运行收集不同的信息.有时可能是他们那天吃的东西.其他可能是血糖,或血压(这实际上是两个数字),其他可能是多个问题(今天你的疼痛怎么从1-10?),所有这些都是我们永远不会真正知道的提前最终客户要求的是什么,或者真正接受的是什么.
我们还将在整个计划中一致地绘制这些数据,并在较不规则的基础上生成更大的报告.
理想情况下,我希望尽可能多地硬编码,因为我们使用SQL,并且坚持关系数据库最佳实践将简化数据库设计和应用程序设计(我正在编写这两者).
我们正在进行一些试运行,我的第一个倾向是从客户那里获取尽可能多的信息,对数据库中的表进行硬编码,然后从那里构建.如果我们发现我们需要使用属性表和attribue_value表来收集这些属性(以及有趣的实现表单构建器,如下拉菜单 - 从而下拉菜单选项和验证/需要),我们可以这样做后来发布.
我基本上经历了每个相关的堆栈溢出帖子; 大多数人说避免EAV,更好地了解应用程序的要求,并且,在某些时候,如果客户TRULY需要EAV实施,那么继续执行它.
有没有人曾经使用混合动力车型?你能讨论一下吗?
有没有人成功实施过EAV模型,你能讨论一下吗?
你有没有做过类似的决定,决定不为一个似乎可能成为候选人的项目实施EAV?结果怎么样?
以下是我在此过程中发现的一些有趣的读物:
http://decipherinfosys.wordpress.com/2007/01/29/name-value-pair-design/ 存储时间序列数据,关系数据还是非存储数据? 数据库EAV优点/缺点和替代 实体 - 属性 - 值(EAV)的替代方案?
我有活动和照片,然后评论两者.现在,我有两个评论表,一个用于与事件相关的评论,另一个用于照片评论.架构与此类似:
CREATE TABLE EventComments
(
CommentId int,
EventId int,
Comment NVarChar(250),
DateSubmitted datetime
)
CREATE TABLE PhotoComments
(
CommentId int,
PhotoId int,
Comment NVarChar(250),
DateSubmitted datetime
)
Run Code Online (Sandbox Code Playgroud)
我的问题是我是否应该将它们组合起来,并添加一个单独的交叉引用表,但我想不出有办法正确地做到这一点.我觉得这应该没事,你有什么想法?
编辑
根据沃尔特的回答(以及一些轻读),我想出了这个:
CREATE TABLE Comments
(
CommentId int,
Comment NVarChar(250),
DateSubmitted datetime
CONTRAINT [PK_Comments] PRIMARY KEY
(
CommentId
)
)
CREATE TABLE EventComments
(
CommentId int,
EventId int
)
CREAT TABLE PhotoComments
(
CommentId int,
PhotoId int
)
ALTER TABLE EventComments ADD CONSTRAINT FK_EventComments FOREIGN KEY (CommentId) REFERENCES Comments(CommentId)
ALTER TABLE PhotoComments …Run Code Online (Sandbox Code Playgroud) 有哪些好方法可以对需要查询的数据进行建模,但是哪些方法无法完全预先定义?
例如...说我想模拟有关世界各国的信息.每个国家都有人口,国旗和语言清单,这很容易.但是说我们也想模拟他们国家棒球队的输赢记录,当然并非所有国家都有.或者,我们想跟踪他们的国王和王后的血统(再次,显然不适用于大多数国家).或者,我们决定我们想要模拟平均氏族成员在一生中建立的蒙古包的数量.
无论如何,重点是,我们不会(也永远不会)知道在它袭击我们之前会发生什么.哪些方法既可扩展又可查询?
这可能是一个很好用于以文档为中心的数据库(MongoDB?),或者某些设计模式可能应用于经典的Relational数据库?