【问题标题】:Some clarification on a database design issue please, How much to use one table?请对数据库设计问题进行一些澄清,一张表使用多少?
【发布时间】:2013-07-09 00:10:33
【问题描述】:

我有一个“LibraryItem”,它链接到一个“Library”表:

Library-<LibraryItem>-Organisation.

我将 LibraryItem 表用于许多不同类型的 LibraryItems,而且每个 LibrayItem 都链接到一个 组织时间>。我现在意识到我需要提供个人用户库,并且我也可以使用 LIbraryItem 表来保存 Personal Library Item 记录。每条记录都需要一个 UserId 作为 FK。但是我担心的是,这个 LibrayItem 表现在被用于许多不同的 LibraryItem 类型,特别是保存 system LibraryItem 记录以及 个人记录。也许我不应该担心,因为这就是数据库的意义所在?

赞赏,

谢谢。

编辑:

为了简化事情,我最终可能会为不同类型的“LibraryItem”使用不同的数据库视图来执行 CRUD 操作。

【问题讨论】:

    标签: sql-server sql-server-2008 sql-server-2005 sql-server-2008-r2


    【解决方案1】:

    在 ORM 世界中,有两种常用的方法来映射继承层次结构。您没有提到使用 ORM,但是无论如何这些模式都适用。

    您有一个 LibraryItem,然后是 PersonalLibraryItem 和 SystemLibraryItem,它们都是 LibraryItem 的类型。

    在逐层表 (TPH) 映射中,整个继承层次结构映射到单个表。在这里,您有一个 LibraryItemtable 来保存 PersonalLibraryItem 和 SystemLibraryItem。

    CREATE TABLE LibraryItem
    (
        ID INT NOT NULL PRIMARY KEY,    -- Shared by all types 
        Title NVARCHAR(100) NOT NULL,   -- Shared by all types 
        UserID INT NULL                 -- Only used by PersonalLibraryItem, and therefore is NULLable.
        SystemItemAttr INT NULL         -- Only used by SystemLibraryItem, and therefore is NULLable.
    )
    

    优点:更少的表,因此更少的连接和更快的查询(通常)

    缺点:如果有许多子类,每个子类都有各自的字段,则表会变得“稀疏”,可能会导致存储空间浪费。在查询整个行时,即使您只对单个子类感兴趣,也必须始终读取(尽管可以使用非聚集索引来缓解这种情况)。

    在每个类型的表 (TPT) 映射中,继承层次结构中的每个类型都映射到其单独的表,并且所有表都通过一个公共 ID 链接:

    CREATE TABLE LibraryItem
    (
        ID INT NOT NULL PRIMARY KEY,    -- Shared by all types 
        Title NVARCHAR(100) NOT NULL,   -- Shared by all types 
    )  
    
    CREATE TABLE PersonalLibraryItem 
    (
        ID INT NOT NULL PRIMARY KEY,    -- Shared by all types 
        UserID INT NOT NULL             -- Note NOT NULL 
    )  
    
    CREATE TABLE SystemLibraryItem
    (
        ID INT NOT NULL PRIMARY KEY,    -- Shared by all types 
        SystemItemAttr INT NOT NULL     -- Note NOT NULL 
    )  
    

    优点:不浪费列,不浪费空间。如果只查询一个子类,则只需要读取属于该子类的数据。

    缺点:如果查询多个子类,则必须连接各个表,因此性能会受到影响。

    在两种模式之间进行选择是一种平衡行为,取决于许多因素,包括层次结构中有多少子类、这些子类有多少字段以及如何查询数据。

    希望这会有所帮助。

    【讨论】:

    • 关于 ORM 的要点。是的,我正在使用 EF ORM。忘了这个,也许我的心态太关系了!!!
    • 现在阅读全文。我通常使用 TPT 模式,因为我的心态是关系型的,然后规范化表格。但是,我已经开始使用映射到更通用物理表的“特定主题”数据库视图。是的,我可能会遇到稀疏问题,但正如你提到的,有数据库机制可以解决这个问题。有趣的一点是,在 ORM 中使用 DB View 比使用 TPH 方法更好还是更差?
    • 不,我不使用 TPT,我很困惑。我目前实际上不使用 TPT 或 TPH,只是直接使用实体/表或视图映射。
    猜你喜欢
    • 1970-01-01
    • 2014-07-14
    • 2013-08-06
    • 2014-04-29
    • 2011-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多