为了制作一个文档管理系统,我正在查看像MongoDB这样的文档存储,但是因为我对常规数据库(Firebird,Sql Server,Mysql)有更多的经验,我想知道是否有可能建立一个文档存储在关系上的顶层之一。
文档存储的优点,架构较少:
但是有一个关系:
那么,在这种情况下如何处理关系数据库呢?
答案 0 :(得分:5)
考虑Martin Fowler的Serialized LOB模式:
CREATE TABLE Documents (
documentid SERIAL PRIMARY KEY,
-- fixed relational attributes ...
document TEXT -- contains XML, YAML, whatever
);
您可以将包含动态属性的任何半结构化数据放入document
列。您无法轻松使用SQL谓词来搜索或按该blob中的字段排序。但是你无论如何都不可能 - 变量属性是一个非关系概念,无论如何在SQL中支持它们都很尴尬。
您可以使用混合方法,在常规列中存储一些固定属性,以及blob中的所有变量属性内容。
这指出了为什么存在面向文档的数据库。它们旨在解决关系范式选择不支持的问题。但面向文档的数据库并没有做一些关系数据库所做的很酷的事情,比如参照完整性甚至数据类型的一致性。
答案 1 :(得分:3)
一个简单的MySQL示例:
CREATE TABLE Docs (
id INT,
attr VARCHAR(255),
value BLOB,
PRIMARY KEY (id, attr),
KEY attr_index (attr)
)
一旦你有了,你就可以向文档添加任何属性并填充值中的任何内容,并且可以在文档表上使用自联接来执行复杂的查询,如:
SELECT * FROM Docs AS d1, docs AS d2 WHERE d1.attr = "foo" AND d2.attr = "bar"
返回包含foo和bar属性的文档。