Orm 访问无模式数据的最佳实践?

Orm 访问无模式数据的最佳实践?,orm,schemaless,Orm,Schemaless,我正在玩弄RDF,尤其是如何访问存储在RDF存储器中的信息。与传统关系数据库的巨大区别在于缺少预定义的模式:在关系数据库中,您知道表具有这些列,并且您可以从技术上将每一行映射到类的实例。该类具有定义良好的方法和定义良好的属性 在无模式系统中,您不知道与给定信息关联的数据是什么。这就像有一个数据库表,其中包含任意数量的列,而不是预定义的列,并且每一行都可以包含任意数量的列中的数据 与ObjectRelational映射器类似,还有对象RDF映射器。我现在正在玩的两个游戏是猎鹰和冲浪。基本上,它们为

我正在玩弄RDF,尤其是如何访问存储在RDF存储器中的信息。与传统关系数据库的巨大区别在于缺少预定义的模式:在关系数据库中,您知道表具有这些列,并且您可以从技术上将每一行映射到类的实例。该类具有定义良好的方法和定义良好的属性

在无模式系统中,您不知道与给定信息关联的数据是什么。这就像有一个数据库表,其中包含任意数量的列,而不是预定义的列,并且每一行都可以包含任意数量的列中的数据

与ObjectRelational映射器类似,还有对象RDF映射器。我现在正在玩的两个游戏是猎鹰和冲浪。基本上,它们为您提供了一个资源对象,其方法和属性是动态提供的。这有点道理。。。然而,这并不是那么容易。在许多情况下,您希望有一个定义良好的接口,并且在设置和获取模型对象上的数据时,能够更好地控制发生的事情。从某种意义上说,拥有这样一个通用的访问权限会让事情变得困难

我注意到的另一件事(也是最重要的一件事)是,即使在一般情况下,无模式数据预期会提供关于资源的任意信息,但实际上,您或多或少知道倾向于在一起的“信息类”。当然,您不能排除其他信息的存在,但在某些情况下,这是一个例外,而不是正常情况,尽管对于严格的模式来说,该例外非常敏感,可能会造成太大的破坏。在文章的rdf表示中(例如,与RSS/ATOM提要类似),您知道所描述资源的术语,并且可以将它们映射到定义良好的对象。如果提供其他信息,则可以定义扩展对象(从基本对象继承)以提供增强信息的访问器。因此,在某种意义上,您可以通过“面向模式的对象”来处理无模式的数据,当您想要查看感兴趣的特定附加信息时,可以对其进行扩展

我的问题与您关于无模式数据存储的实际使用实践的经验有关。它们如何映射到面向对象的世界,以便您能够熟练地使用它,而不会过于接近无模式存储的“裸机”?(在RelDB术语中,不需要使用太多SQL,也不会直接影响表结构)


访问注定是非常通用的(例如,SuRF“插入属性”是您访问数据所能达到的最高、最专业的级别),或者为特定的模式提供专门的类也是一种很好的方法,然而,引入了大量类来访问新的和意外的关联数据的风险?

我没有将无模式数据库与OOP相结合的经验,我有一年的无模式数据库和脚本编写经验。 根据我的经验,这是很有用的。我使用的数据库也是非类型化的(所有任意字符串)。这将带来以下好处:

  • 您不必关心数据库结构。如果你需要储存东西,你只需要储存它。而且您不必关心适合脚本语言的数据类型
  • 您可以在需要时轻松地向“对象”添加调试信息,而不必为大多数表行设置空列。这样,您甚至可以在需要的地方存储大量数据
  • 您不必关心数据库结构的更新。您只需将新软件版本附带的新数据写入数据库。这样,您就不需要管理员来更新表结构和转换旧数据。它只是在飞行中发生的
  • 如果键值对的键有一个有意义的全名,那么数据就不需要太多文档
所以在我的例子中,无模式数据库和脚本非常有用,并且取得了巨大的成功

当您考虑将对象用于无模式数据库时,我会尝试通过将对象存储在哈希表中来保持自由。这将使您可以自由访问所有键值对-无论您选择了哪个“对象”。它还允许您根据需要添加新的键值

如果您的对象(如RSS提要中的对象)有一个定义良好的基,那么就有必要提出一个基对象,它封装了定义良好的基,但也有一些散列映射供您自由使用

一旦您发现越来越多的键值对成为“标准”,只需更新您的对象模型来封装这些键值对,您的软件就会演变成正确的数据结构。以后将一些数据移动到传统的RMDB可能更有意义


不要过度设计-在需要时实现这些特性…

我认为无模式XML文件的最佳实践是为其创建模式

没有模式并不特别好。这意味着您无法以任何方式验证文件,只能检测文件是否为格式良好的XML

对文件没有任何语义似乎是可疑的。因为这意味着你不知道你应该、做过或将要投入什么。如果是这样的话,这听起来像是寻找问题的解决方案

如果您还不知道模式语言,所以没有模式,请查看DTD。这很简单。如果您的应用程序中有验证实用程序或验证解析器,您可以在大约一两个小时内学会并掌握它

如果阻止您拥有模式的问题是您的模式规则似乎不适合您到目前为止看到的模式定义文件类型,请不要担心

虽然DTD甚至XSD(XML模式)文件都有些不灵活,但还有其他更灵活的模式文件类型。相信我,它们也比XSD简单得多

看看
public void setter(Element e) throws NoSuchElementException {
    try {
        this.Name = e.getChild("Name").getValue();
    } catch (Exception ex) {
        throw new NoSuchElementException("Element not found for Name: "+ex.getMessage());
    }
}