我需要设计一个表,用于存储文件的所有元数据(即文件名,作者,标题,创建日期)和自定义元数据(用户已将其添加到文件中,例如CustUseBy,CustSendBy)。自定义元数据字段的数量无法预先设置。确实,确定在文件上添加了哪些以及哪些自定义标签的唯一方法是检查表中存在的内容。
为了存储此信息,我创建了一个基本表(具有文件的所有公共元数据),一个Attributes表(包含可以在文件上设置的其他可选属性)和一个FileAttributes表(为文件的属性分配值)。
CREAT TABLE FileBase ( id VARCHAR(32) PRIMARY KEY, name VARCHAR(255) UNIQUE NOT NULL, title VARCHAR(255), author VARCHAR(255), created DATETIME NOT NULL, ) Engine=InnoDB;
CREATE TABLE Attributes ( id VARCHAR(32) PRIMARY KEY, name VARCHAR(255) NOT NULL, type VARCHAR(255) NOT NULL ) Engine=InnoDB;
CREATE TABLE FileAttributes ( sNo INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, fileId VARCHAR(32) NOT NULL, attributeId VARCHAR(32) NOT NULL, attributeValue VARCHAR(255) NOT NULL, FOREIGN KEY fileId REFERENCES FileBase (id), FOREIGN KEY attributeId REFERENCES Attributes (id) ) Engine=InnoDB; 样本数据:
INSERT INTO FileBase (id, title, author, name, created) VALUES ('F001', 'Dox', 'vinay', 'story.dox', '2009/01/02 15:04:05'), ('F002', 'Excel', 'Ajay', 'data.xls', '2009/02/03 01:02:03');
INSERT INTO Attributes (id, name, type) VALUES ('A001', 'CustomeAttt1', 'Varchar(40)'), ('A002', 'CustomUseDate', 'Datetime');
INSERT INTO FileAttributes (fileId, attributeId, attributeValue) VALUES ('F001', 'A001', 'Akash'), ('F001', 'A002', '2009/03/02'); 现在的问题是我想以这种方式显示数据:
FileId, Title, Author, CustomAttri1, CustomAttr2, ... F001 Dox vinay Akash 2009/03/02 ... F002 Excel Ajay
什么查询会产生此结果?
问题涉及MySQL,实际上,该DBMS具有针对此类问题的特殊功能:GROUP_CONCAT(expr)。查看有关功能分组的MySQL参考手册。该功能是在MySQL 4.1版中添加的。您将GROUP BY FileID在查询中使用。
我不确定您希望结果如何显示。如果要为每个项目列出每个属性(即使未设置),也将更加困难。但是,这是我的建议:
SELECT bt.FileID, Title, Author, GROUP_CONCAT( CONCAT_WS(':', at.AttributeName, at.AttributeType, avt.AttributeValue) ORDER BY at.AttributeName SEPARATOR ', ') FROM BaseTable bt JOIN AttributeValueTable avt ON avt.FileID=bt.FileID JOIN AttributeTable at ON avt.AttributeId=at.AttributeId GROUP BY bt.FileID; 这将以相同顺序为您提供所有属性,这可能会很有用。输出将如下所示:
'F001', 'Dox', 'vinay', 'CustomAttr1:varchar(40):Akash, CustomUseDate:Datetime:2009/03/02' 这样,您只需要一个数据库查询,并且输出很容易解析。如果要在数据库中将属性存储为真实的Datetime等,则需要使用动态SQL,但我会避免这样做,并将值存储在varchars中。来源:stack overflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。