前段时间我加入了Oracle(11.2)数据库项目。 JSON字符串在其中大量用于关系数据:
private string _lecturesJson;
public string LecturesJson
{
get { return Lectures.ToJson(); }
set { _lecturesJson = value; Lectures = value.FromJson<List<string>>(); }
}
public List<string> Lectures { get; set; }
整个架构以某种方式混合了关系和文档数据库范例。我试图说服建筑师这样的解决方案很糟糕,但他坚持认为这种架构非常现在。我同意文档数据库世界中有很多事情发生。但这完全不同,不是吗?在我看来,至少有几个原因导致它变坏:
应用程序本身应针对数据查询进行优化,因为大多数时候都会使用搜索和数据导出。
我是对的吗?这是完全错误还是有一些我不知道的趋势?这个体系结构错误还有其他原因吗?
答案 0 :(得分:2)
你是对的。
您可以在关系数据库中存储clobs / blob。这并不意味着使用关系数据库,因为doc存储是一种趋势,更多的是反模式
如果您需要doc商店,请尝试使用Mongo或OrientDB。
如果您需要跨多个JSON加入数据,这将非常低效,将数据放在字段中意味着您可以加入任何列。这也意味着你需要了解数据建模的人。
如果你需要在JSON中提取数据,最好是制作存储过程,或者更好的是从表中提供JSON的REST API,那么你可以灵活地提供任何其他表示而不会影响你的模型。 ..但是根据你的描述,听起来你甚至不需要json。
答案 1 :(得分:1)
“整个架构以某种方式混合了关系和文档数据库范例。” - 你是对的。完全可以以这种方式使用关系数据库。当您仅搜索并使用JSON时,它是完全合理的:全部或全部。您使用主键键入它,而不是内部的值。
如果你确实需要在里面搜索一组有限的值,那么完全可以在这些值上添加一些额外的列和索引。您的搜索问题很容易解决。
至于数据库大小 - 除非你在谈论太字节或数PB的信息,我认为这种担忧被夸大了。无论如何,您应该按日期对事务数据进行分区,并将旧分区移出到历史数据库。如果数据库中有多年的事务数据,则会出现另一个问题。
答案 2 :(得分:0)
Oracle 12c本身支持JSON,请查看here
感谢。
答案 3 :(得分:0)
你可以使用任何东西,但你的最佳做法是密钥应该只在GUID字段上。在规范化的数据库中,您通常会加入这些密钥。
如果您确实需要匹配整个文档,请在插入时生成文档的哈希并索引该哈希值。你可以加入哈希,它会更有效率。
也就是说,如果您要存储整个JSON,可能需要查看mongo或其他文档存储。