代码之家  ›  专栏  ›  技术社区  ›  fgregg

关系数据库中的原子事实建模

  •  1
  • fgregg  · 技术社区  · 16 年前

    我想记录下各种来源对一个历史人物的看法。

    • 维基百科网站说苏珊·安东尼生于1820年2月15日,她最喜欢的颜色是蓝色
    • 百年奋斗 苏珊·安东尼生于1820年2月12日,她最喜欢的颜色是红色
    • 妇女选举权的历史 据说苏珊·安东尼出生于1820年2月15日,她最喜欢的颜色是红色,她是亚伯拉罕·林肯的第二个表妹

    • 用户A 90%相信Susan B.Anthony出生于1820年2月15日;75%的人相信她最喜欢的颜色是蓝色,30%的人相信她是亚伯拉罕林肯的表亲
    • 用户B有30%的信心Susan B.Anthony出生于1820年2月12日;60%的人相信她最喜欢的颜色是蓝色,10%的人相信她是亚伯拉罕林肯的表亲

    我还想使用关系数据库数据存储,我认为这样做的方式是为我希望用户能够表达其信心的每种原子事实类型创建一个单独的表。所以在这个例子中,总共有八个表,三个单独的表代表三个单独的原子事实。

    Source(id)
    Person(id)
    
    Claim(claim_id, source, FOREIGN KEY(source) REFERENCES Source(id) )
    Alleged_birth_date(claim_id, person, birth_date, FOREIGN KEY(claim_id) REFERENCES Claim(id), FOREIGN KEY(person) REFERENCES person(id))
    Alleged_favorite_color(claim_id, person, color, FOREIGN KEY(claim_id) REFERENCES Claim(id), FOREIGN KEY(person) REFERENCES person(id)) 
    Alleged_kinship(claim_id, person, relationship type, kin, FOREIGN KEY(claim_id) REFERENCES Claim(id), FOREIGN KEY(person) REFERENCES Person(id))
    
    User(id)
    Confidence_in_claim(user, claim, confidence, FOREIGN KEY(user) REFERENCES User(id), FOREIGN KEY(claim) REFERENCES claim(id))
    

    这感觉它变得非常复杂,非常快,因为实际上需要记录很多类型的原子事实。有更好的方法吗?

    我认为,这是马丁·福勒所说的同一个问题 Contradictory Observations

    4 回复  |  直到 16 年前
        1
  •  3
  •   user107924    16 年前

    您应该尝试星型模式模型,以一个“事实”表和几个“维度”表为中心。这是一个经过充分探索的模型,有许多数据库优化。

    索赔事实(来源id、人员id、用户id、详细信息id、重量)

    源维度(id、名称)

    用户维度(id、名称)

    详细信息\u维度(id、姓名不为空、颜色为空、亲属关系为空、生日为空)

    每个索赔都有一个来源、人员、用户和详细信息。详细信息的名称值将是“亲属关系”、“生日”等值。

    请记住,这是一个OLAP模式(而不是OLTP结构),因此它不是完全规范化的。这样做的好处超过了由于冗余而可能遇到的任何问题,因为为数据仓库配置的DBMS对星型模式的查询进行了高度优化。

    推荐阅读:数据仓库工具包(Kimball等人)

        2
  •  2
  •   Javier    16 年前

    RDF

    整个“语义网”的想法是在RDF上发布大量事实,搜索引擎将是推理引擎,可以遍历统一的图来查找关系。

    还有一些机制可以引用一个三元组,所以你可以说一些关于断言的事情,比如它的起源(谁说的?),或者什么时候被断言(他什么时候说的?),或者你认为它是真的,等等。

    作为一个大例子,整个 OpenCyc

        3
  •  1
  •   Paul Sonier    16 年前

    我想你想用的是一个“财产袋”。您希望有一个包含ID、一个“键”(在本例中为指称的信息(如“亲属关系”))和一个“值”(在本例中为指称的值(如“亚伯拉罕·林肯”))的表,而不是为您想要描述的每种类型的事实建模。然后,您需要第二个表,将您的索赔人与该表联系起来,以及他们对该信息的信任程度。该表将只包含来源ID、财产ID以及来源对该信息的信任度。这样,您就可以拥有一个来源,该来源具有大量或大量信息几乎没有信息;您还可以对给定属性中具有不同置信度的不同来源进行建模;您可以存储多少种不同类型的信息也没有限制。

    这是一个非常标准的解决方案,适用于您需要交叉引用大量可选信息的情况。

        4
  •  0
  •   Charlie Martin    16 年前

    这感觉很复杂,很快

    ontology knowledge representation .