首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >枢轴概念

枢轴概念
EN

Stack Overflow用户
提问于 2009-04-04 07:06:05
回答 2查看 376关注 0票数 1

嗨,

我的数据库设计如下:

代码语言:javascript
复制
Table File (FileID, Name, Details)

Table Attributes (AttID, AttName, AttType)

Table AttValues (FileID, AttID, AttValue)

在运行时之前,还不知道一个File中有多少个Attributes以及名称是什么。

我想在前端插入后以如下方式显示:

代码语言:javascript
复制
FileID, FileName, Details, (Rows of Attribute Table as Column here).

也就是说,谁能给我一段Java或MySQL的代码来实现这个旋转结果。

非常感谢您的宝贵时间。

或者有没有其他更好的方法来存储数据,这样我就可以很容易地得到想要的结果。

EN

回答 2

Stack Overflow用户

发布于 2009-04-04 07:17:43

这需要两个查询。首先选择File

代码语言:javascript
复制
SELECT * FROM File WHERE (...)

然后,获取Attributes

代码语言:javascript
复制
SELECT *
FROM AttValues
     JOIN Attributes ON (Attributes.AttId = AttValues.AttId)
WHERE FileId = $id

后一个查询将为每个Attribute提供一行,您可以通过编程方式对其进行透视,以便在前端显示:

代码语言:javascript
复制
foreach(row in result) {
    table.AddColumn(Header = row['AttName'], Value = row['AttValue']);
}

根据需要适应您的本地编程环境。

当然,这只适用于具有相同属性的单个FileFile。如果您希望显示具有不同Attributes的多个文件,则可以预取所有AttName

代码语言:javascript
复制
SELECT Attributes.AttId, Attributes.AttName
FROM Attributes 
     JOIN AttValues ON (Attributes.AttId = AttValues.AttId)
WHERE FileId IN ( $list_of_ids )

然后像这样加载这些值:

代码语言:javascript
复制
SELECT *
    FROM AttValues
WHERE FileId IN ( $list_of_ids )

并使用本地关联数组从AttId映射到列索引。

作为最后的优化,您可以将最后两个查询合并到一个OUTER JOIN中,以避免第三次往返。虽然这可能会增加传输的数据量,但如果您的类库支持命名列,它也会使填充表变得更容易。

票数 1
EN

Stack Overflow用户

发布于 2009-04-04 10:28:02

我最近回答了一个类似的问题:How to pivot a MySQL entity-attribute-value schema。答案是特定于mysql的,但我想这是可以的,因为问题是用mysql标记的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/716683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档