【问题标题】:Unique Identifier Across Tables跨表的唯一标识符
【发布时间】:2011-01-21 06:16:10
【问题描述】:

首先:我查看了类似的问题,但没有找到答案。抱歉,如果这是重复的。

我对 MySQL 还是很陌生。

假设我有三张桌子:HousesCarsOffice Buildings

所有这些东西都有窗口,所以我还需要一个 Windows 表。

现在,每个窗口都可以向上或向下、双窗格或单窗格等。每个窗口都有一个唯一的 ID(如果不应该,请纠正我)。每个窗口还需要记录谁打开或关闭了它,这就是为什么我认为首先需要一个 Windows 表。

问题:每个Window都必须有一个parent_id。但是当有一辆 ID 为 XX 的汽车,以及具有相同 ID 的办公楼和房屋时,就会出现问题。当我的页面加载时,我如何知道将窗口放置在哪里?

我认为这个问题有很多答案......我正在寻找最好的方法。

附:窗户、汽车、房屋和办公楼只是说明性的例子。不是我的实际数据。

【问题讨论】:

    标签: php mysql uniqueidentifier


    【解决方案1】:

    所以您的意思是每个窗口都可以属于房屋、汽车或办公楼?为此建立的模式是多态关联,这只是“将相关模型的类型与其 id 一起存储”的一个花哨的词:

    Table `windows`
    ===============
    id
    parent_id
    parent_model
    ...
    
    window(1, 42, 'house', ...)
    window(2, 7, 'car', ...)
    ...
    

    这允许轻松的选择性加入和查询:

    SELECT * FROM `windows` JOIN `cars` ON
       (`windows`.`parent_model` = 'car' AND `windows`.`parent_id` = `cars`.`id`)
       ...
    

    【讨论】:

    • 所以我只是存储(在 parent_model 中)它所属的表的名称?如果它是表房屋中的房屋,则 parent_model 是“房屋”?
    • 这是个问题吗?如果查询(无论出于何种原因)指定了除了房屋、汽车或建筑物之外的 parent_model 怎么办? SQL 怎么知道不让这种情况发生?
    • @Peter 那时它不会匹配任何记录。这只是一个问题,因为您不会为该查询返回任何数据。
    • 我想到了一个更好的(实际上是完美的)示例:SO 对回复和帖子有投票权。所有的选票都以这种方式存储在一个表中吗?一个用户如何保证一票?
    • @Peter 我不知道。不过,当我说这是一种既定模式时,请相信我。 :)
    【解决方案2】:

    您可能还需要一张表来映射哪个窗口映射到哪个实体(汽车/房屋/办公室)

    Table: window_mapping   
    Columns: id (primary key / auto generated)
             Window_id (not null, ref to Window table primary key)
             Entity_id  (not null, ref to car /house /office table primary key) 
             entity _def (text with values, Car / house /office) 
    

    或者另一种表格方法是

    Table: window_mapping   
    Columns: id (primary key / auto generated)
             Window_id (not null, ref to Window table primary key)
             house_id  (not null, ref to house table primary key) 
             car_id  (not null, ref to house table primary key) 
             office_id  (not null, ref to house table primary key) 
    

    虽然我更喜欢第一个

    如果你扩展你的用例,我可以尝试提供更多帮助

    【讨论】:

    • 我想我明白了……window_mapping 的工作是将窗口连接到它的适当位置?
    • 是的,并且有更好的标准化数据存储
    • 这基本上是一个多态的多对多关联。如果一扇窗户可以属于多个建筑物/汽车/房屋,这是正确的做法。但是,如果它只是一个一对多的关联,那就太过分了。
    • 是的,你是对的。我假设他想要建立多对多的关系
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    • 2012-07-18
    • 1970-01-01
    相关资源
    最近更新 更多