是否有针对PHP/MySQL的实体属性值框架?我开始写自己的,但我觉得它已经完成了.有什么建议?
前几天我询问选择一种存储用户配置文件的方法,并收到David Thomas Garcia的一个有趣的回复,建议我使用Table Module设计模式.看起来这可能是我想要的方向.我在Google上发现的所有内容似乎都是相当高级别的讨论,所以如果有人能指出我的某些例子,或者让我更好地了解所涉及的基本要素,那将是非常棒的.
database database-design design-patterns entity-attribute-value
我想通过指定innertable.id = outertable.id为内部查询提供WHERE条件.但是,MySQL(5.0.45)在'where子句'中报告"未知列'outertable.id'".这种查询是否可行?
内部查询使用GROUP BY将行旋转到列.这可以完全在外部查询中执行,但由于额外的连接可能会产生额外的开销.
或者,我可以在内部查询中省略WHERE条件,而是指定一个ON outertable.id = innerquery.id,但它会获取整个内部查询行集再次连接外部,这是低效的.
实际的SQL如下所示:
select t.ticketid, u.userid, t.fullname, u.loginapi_userid, t.email, tp.subject, tp.contents, a.PhoneNumber, a.Location, a.Extension, a.BusinessUnit, a.Department
from swtickets t
inner join swticketposts tp on t.ticketid = tp.ticketid
inner join swusers u on t.userid = u.userid
left join
(
select
cfv.typeid,
min(case cfv.customfieldid when 1 then cfv.fieldvalue end) as 'PhoneNumber',
min(case cfv.customfieldid when 3 then cfv.fieldvalue end) as 'Location',
min(case cfv.customfieldid when 5 then cfv.fieldvalue end) as 'Extension',
min(case cfv.customfieldid when 8 then cfv.fieldvalue …Run Code Online (Sandbox Code Playgroud) 我们必须重新设计从MySQL到PostgreSQL的传统POI数据库.目前,所有实体都有80-120个属性,代表各个属性.
我们被要求考虑新数据库的灵活性和良好的设计方法.但是新设计应该允许:
ñ没有.任何实体的属性/属性,即任何实体的属性都没有固定,可能会定期更改.
允许内容管理员,以新的属性添加到现有实体上飞使用通过管理界面,而不是使在DB模式的改变所有的时间.
有关EAV性能问题的讨论很多,但如果我们不采用混合EAV,我们最终会:
无论如何,我们正在考虑新设计(包括基本ERD):
为每个实体提供单独的表,其中包含一些独有的基本信息,例如id,name,address,contact,created等.
有2个表属性类型和属性来存储属性信息.
使用多对多关系将每个实体链接到属性.
将地址存储在不同的表中,并使用外键链接到实体.

我们认为这将使我们在添加,删除或更新属性时更加灵活.
然而,这种设计将在获取数据时导致连接数量增加,例如,为了显示给定体育场的所有"属性",我们可能具有20个以上连接的查询以获取单行中的所有相关属性.
您对此设计有何看法,以及您对改进设计的建议.
谢谢你的阅读.
如果你必须创建一个类似的应用程序 - 比如一个博客应用程序,那么创建数据库模式就相对简单了.你必须创建一些表,tblPosts,tblAttachments,tblCommets,tblBlaBla ......就是这样(好吧,我知道,这有点简化,但你理解我的意思).
如果你有,你要允许用户定义模式的部分应用程序在运行时.假设您要构建一个用户可以记录任何类型数据的应用程序.一个用户想要记录他的工作时间(startTime,endTime,项目ID,描述),下一个想要收集烹饪食谱,其他人可能是股票报价,他们的婴儿每周体重,他们花在食物上的每月费用,他们的结果最喜欢的足球队或你能想到的任何东西.
您如何设计数据库来保存所有非常不同类型的数据?您是否会创建一个可以包含所有类型数据的通用模式,是否可以创建反映用户数据模式的新表,或者您是否有另外一个好主意可以做到这一点?
如果它很重要:我必须使用SQL Server/Entity Framework
database sql-server schema entity-framework entity-attribute-value
我正在尝试像Database Design for Tagging这样的东西,除了我的每个标签都按类别分组.
例如,假设我有一个关于车辆的数据库.假设我们实际上并不太了解车辆,因此我们无法指定所有车辆将具有的列.因此,我们将用信息"标记"车辆.
1. manufacture: Mercedes
model: SLK32 AMG
convertible: hardtop
2. manufacture: Ford
model: GT90
production phase: prototype
3. manufacture: Mazda
model: MX-5
convertible: softtop
Run Code Online (Sandbox Code Playgroud)
现在您可以看到所有汽车都标有其制造和型号,但其他类别并不完全匹配.请注意,汽车只能拥有每个类别中的一个.IE浏览器.一辆汽车只能有一个制造商.
我想设计一个数据库来支持搜索所有梅赛德斯,或者能够列出所有制造商.
我目前的设计是这样的:
vehicles
int vid
String vin
vehicleTags
int vid
int tid
tags
int tid
String tag
int cid
categories
int cid
String category
Run Code Online (Sandbox Code Playgroud)
我有所有正确的主键和外键,除了我无法处理每辆车只能有一个制造商的情况.或者我可以吗?
我可以在vehicleTags中为复合主键添加外键约束吗?IE浏览器.我是否可以添加一个约束,使得复合主键(vid,tid)只能在vehicleTags中没有行时才添加到vehicleTags,这样对于同一个vid,还没有一个tid在同样的cid?
我的猜测是否定的.我认为这个问题的解决方案是向vehicleTags添加一个cid列,并创建新的复合主键(vid,cid).它看起来像:
vehicleTags
int vid
int cid
int tid
Run Code Online (Sandbox Code Playgroud)
这可以防止汽车有两个制造商,但现在我已经复制了tid在cid中的信息.
我的架构应该是什么?
在我之前的问题中,Tom在我的数据库模式中发现了这个问题,你如何做多对多表外连接?
编辑
我知道在示例制造中应该真的是车辆表中的一列,但是假设你不能这样做.这个例子只是一个例子.
我正在尝试利用NH来映射到数据模型,这是对EAV/CR数据模型的宽松解释.
我有大部分工作,但我正在努力映射Entity.Attributes集合.
以下是有问题的表格:
--------------------
| Entities |
--------------------
| EntityId PK |-|
| EntityType | |
-------------------- |
-------------
|
V
--------------------
| EntityAttributes | ------------------ ---------------------------
-------------------- | Attributes | | StringAttributes |
| EntityId PK,FK | ------------------ ---------------------------
| AttributeId FK | -> | AttributeId PK | -> | StringAttributeId PK,FK |
| AttributeValue | | AttributeType | | AttributeName |
-------------------- ------------------ ---------------------------
Run Code Online (Sandbox Code Playgroud)
AttributeValue列实现为sql_variant列,我为它实现了NHibernate.UserTypes.IUserType.
我可以创建一个EntityAttribute实体并直接保存它,以便部分层次结构正常工作.
我只是不确定如何将EntityAttributes集合映射到Entity实体.
请注意,EntityAttributes表可以(并且确实)包含给定EntityId/AttributeId组合的多个行:
EntityId AttributeId AttributeValue
-------- ----------- --------------
1 1 Blue
1 …Run Code Online (Sandbox Code Playgroud) 我想将现有属性的代码重命名为其他内容.原因是因为300个产品填写了属性字段,我不想因为我更改了属性的代码而不得不重新导入所有这些产品.
我正在与Magento做一些定制工作,Magento有一个基于EAV模型的数据库设计,我需要一些很好的资源/教程来解释EAV数据库模型.请不要将维基百科作为资源提供......我正在寻找能够以初学者友好的方式教授EAV的东西.
我想提取从EAV(实体属性值)的表,或更具体实体的元数据表的结果(认为像WordPress wp_posts和wp_postmeta),为"很好的格式化的关系表",以做一些排序和/或过滤.
我已经找到了一些如何在查询中格式化结果的示例(而不是编写2个查询并在代码中加入结果),但我想知道"最有效"的方法,特别是对于更大的结果集.
当我说"效率最高"时,我的意思是出现以下情况:
获取姓氏为XYZ的所有实体
返回按生日排序的实体列表
转过来:
** ENTITY ** ----------------------- ID | NAME | whatever ----------------------- 1 | bob | etc 2 | jane | etc 3 | tom | etc ** META ** ------------------------------------ ID | EntityID | KEY | VALUE ------------------------------------ 1 | 1 | first name | Bob 2 | 1 | last name | Bobson 3 | 1 | birthday | 1983-10-10 . | 2 | first name | Jane …
mysql performance database-design pivot entity-attribute-value
database ×4
magento ×2
mysql ×2
schema ×2
sql ×2
attributes ×1
foreign-keys ×1
join ×1
magento-1.4 ×1
nhibernate ×1
performance ×1
php ×1
pivot ×1
postgresql ×1
sql-server ×1
subquery ×1
tags ×1