【问题标题】:Multiple record types and how to split them amongst tables多种记录类型以及如何在表中拆分它们
【发布时间】:2014-09-24 19:55:19
【问题描述】:

我正在研究一种数据库结构,并试图想象将大量相关记录拆分为表的最佳方法。记录都具有它们继承自相同的基本类型,但每个记录都针对其特定用途对其进行扩展。

这 4 个属性适用于每种类型。

id, name, groupid, userid

以下是扩展这 4 个属性的类型。

"Static": value
"Increment": currentValue, maxValue, overMaxAllowed, underNegativeAllowed
"Target": targetValue, result, lastResult

我最初尝试的是创建一个包含 4 个基本属性的“记录”表。然后,我创建了另外 3 个名为“records_static/increment/target”的表,每个表都有其特定属性作为列。然后,我在每个辅助表中的“rowID”列与主表的“id”之间建立了关系。

使用虚拟数据填充表时,我现在在尝试使用查询提取数据时遇到了一些主要问题。唯一的参数是用户 ID,除此之外,我需要的是一个包含与用户 ID 关联的所有列和数据的表。

我不确定我是否应该放弃该表设计,或者我是否只是错误地进行查询。

我希望我解释得足够好,如果您需要更多详细信息,请告诉我。

【问题讨论】:

    标签: sql


    【解决方案1】:

    让设计尽可能简单。

    首先我会尝试一个包含所有可能应用于记录的属性的表。不相关的属性可以是null。您可以对具有 check 约束的特定类型强制执行 null 值。

    如果这不起作用,您可以为每种记录类型创建三个表,而不需要一个公用表。

    如果这不起作用,您可以创建一个带有 1:1 扩展表的基表。请注意,查询要困难得多,每次操作都需要join

    select  *
    from    fruit f
    left join
            apple a
    on      a.fruit_id = f.id
    left join
            pear p
    on      p.fruit_id = f.id
    left join
            ...
    

    设计越复杂,不一致的数据库状态的空间就越大。第二个选项你可以有一个梨和一个具有相同 id 的苹果。在第三个选项中,您可以在基表或扩展表中缺少行。或者这些表可能会相互矛盾,例如在Apple 表中的一个基本行表示“pear”和一个扩展行。我完全相信最终用户会找到一种方法将其输入您的数据库:)

    扔掉复杂的设计,从最简单的开始。您的第一次尝试并非失败:您现在知道在表之间添加关系的成本。这在设计时可能看起来微不足道(甚至“正确”)。

    【讨论】:

    • 太好了,谢谢。我会试一试。好建议。我想我会倾向于回避第一个选项,因为将来可能会引入更多的记录类型,而且我不想最终得到一张超宽的桌子。第二个选项可能更适合我的需要,但我希望使第三个选项起作用。
    • 我太笨了。问题是我使用的是“加入”而不是“左加入”。我没有意识到或忘记了“join”的意思是“inner join”。您关于如何加入扩展表的示例向我展示了我的方式的错误。谢谢你。
    【解决方案2】:

    这是一个典型的“面向对象到关系”的映射问题。你可以找到这方面的书籍。还有很多谷歌点击喜欢

    http://www.ibm.com/developerworks/library/ws-mapping-to-rdb/

    您最容易实现的方法是拥有一个包含存储所有类型所需的所有列的表。确保将它们定义为可为空的。如有必要,只有公共列不能为空。

    【讨论】:

    • 谢谢,我去看看链接。部分问题是我不确定如何为这个问题构建谷歌搜索。 :)
    【解决方案3】:

    仅仅因为对象共享一些相同的属性并不意味着您需要为两个对象使用一个表。这会导致不必要的右外连接,它们具有 1 对 1 的关系,这不是我认为的良好数据库设计。

    但是……

    如果您想以您的方式继续,我认为您需要的只是表中的主键,其中包含公共列“id、name、groupid、userid”(我假设为 ID),那么这将是您表的外键与 currentValue, maxValue, overMaxAllowed, underNegativeAllowed

    【讨论】:

    • 我目前在表之间有一个 id->rowid 关系。不过,查询它似乎很困难。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-12
    • 2019-07-28
    • 1970-01-01
    • 2010-12-25
    • 2010-12-02
    • 1970-01-01
    相关资源
    最近更新 更多