【问题标题】:Best Practice: find row for unique id from multiple tables最佳实践:从多个表中查找唯一 id 的行
【发布时间】:2013-04-17 01:55:52
【问题描述】:

我们的数据库包含 5 个以上的表格

user
---------- 
user_id (PK) int NOT NULL
name varchar(50) NOT NULL

photo
--------
photo_id (PK) int NOT NULL
user_id (FK) int NOT NULL
title varchar(50) NOT NULL

comment
-------
comment_id (PK) int NOT NULL
photo_id int NOT NULL
user_id int NOT NULL
message varchar(50) NOT NULL

所有主键 ID 都是唯一 ID。

所有数据都链接到http://domain.com/{primary_key_id}

用户访问带有 id 的链接后,该链接对所有表都是唯一的。

我应该如何实现来查找这个 id 属于哪个表?


解决方案 1

select user_id from user where user_id = {primary_key_id}

// if not found, then move next
select photo_id from photo where photo_id = {primary_key_id}

... continue on, until we find which table this primary key belongs to.

解决方案 2

  1. 创建对象表来保存所有 uniqe id 和数据类型
  2. 在所有表上为 AFTER INSERT 创建触发器,以在对象表中创建具有其数据类型的行,该数据类型已插入到选定表中
  3. 如果需要,然后执行select语句来查找id所属的表名。

第二种解决方案是双插入。 1 将行插入到具有完整数据的实际表中,2 插入用于在我们在步骤 1 中创建的对象表中插入唯一 id 和表名。

select type from object_table where id = {primary_key_id}

解决方案 3

  1. 添加表名 + id = 编码为新的唯一整数 - 使用 php
  2. 解码 id 并获取带有表名的原始 id(即使它只是数字类型)

我不知道如何在 php 中实现这个,但是这个解决方案听起来更好!?你有什么建议?

【问题讨论】:

  • 两种解决方案都可以。问题更多是关于您需要多久执行一次相关操作。解决方案 2 可能更快,但需要一个额外的表,并且在插入时成本也更高。解决方案 1 更简单,但最多需要 5 个选择语句。顺便说一句:您是否考虑过使用带有“说话”数字的唯一 ID?然后你可以从数字中知道原始表格。
  • 如何创建链接?使您的链接类似于http://domain.com/page.html?pk={id}&table={table}(当您echo 时,链接将表格添加为ID 之类的属性)。稍后您可以解析 url 并将 table 属性用作查询中的变量。表 ID 在整个数据库中不需要是唯一的。如果我理解正确的话,你就是在浪费大量可用的 ID 号码。
  • @luksch 我使用 UUID_SHORT() 为所有表创建唯一 ID。我更喜欢解决方案 3,但不知道如何对其进行编码/解码。你怎么看?
  • @ZZ-bb 我正在尝试在数据上实现类似 facebook api 的实现。
  • 如果您可以更改表定义以使用字符串作为主键,那么您可以在插入行时将您的 id 与表标识符字符串连接起来。

标签: mysql database database-design database-schema uniqueidentifier


【解决方案1】:

跨表保持唯一性真的很重要吗?

  • 如果,请尽可能实施解决方案3(例如使用URL encoding)。
  • 如果,无论如何您都需要“父”表,因此 DBMS 可以强制执行唯一性。
    • 您仍然可以尝试在此基础上实施解决方案 3,
    • 在此处添加一个类型鉴别器1,您将能够(快速)知道为任何给定 ID 引用了哪个表。李>

1 看看this answer 的下半部分。这实际上是一种继承形式。

【讨论】:

    【解决方案2】:

    我不知道您在 cmets 中提到 Facebook 是什么意思,但我会进一步解释我的评论。

    您不需要跨五个数据库表的唯一 ID,每个表只需要一个。您有几个选择如何创建链接(您可以自己创建链接吗?):

    1. 使用 GET 变量:http://domain.com/page.html?pk={id}&table={table}
    2. 使用纯 URL:http://domain.com/{id}{table}

    根据链接的语法,您可以选择解析它的函数。例如,您可以使用以下一项或两项:

    当您让简单模型工作时,您可以添加编码/解码/散列函数。但是你真的需要它们吗?并且在什么级别? (我在这方面没有经验,所以我现在就闭嘴。)

    【讨论】:

    猜你喜欢
    • 2014-10-02
    • 2019-03-25
    • 1970-01-01
    • 2017-02-12
    • 1970-01-01
    • 1970-01-01
    • 2012-04-20
    • 2016-06-17
    • 2019-04-16
    相关资源
    最近更新 更多