最佳实践:从多个表中查找唯一ID的行

时间:2013-04-23 18:14:56

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

我们的数据库包含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所属的表名。
  4. 第二种解决方案将是双重插入。 1插入行到实际表,包含完整数据,2插入用于在对象表中插入唯一ID和表名,我们在步骤1中创建。

    select type from object_table where id = {primary_key_id}
    

    解决方案3

    1. 将表名+ id = encode添加到新的唯一整数 - 使用php
    2. 解码id并获取带有表名的原始id(即使它只是数字类型)
    3. 我不知道如何在php中实现这个,但这个解决方案听起来更好!?你的建议是什么?

2 个答案:

答案 0 :(得分:0)

我不知道评论中Facebook引用的含义,但我会进一步解释我的评论。

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

  1. 使用GET变量:http://domain.com/page.html?pk={id}&table={table}
  2. 使用纯网址:http://domain.com/{id}{table}
  3. 根据链接的语法,您可以选择要解析它的函数。例如,您可以使用以下一项或两项:

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

答案 1 :(得分:0)

保持表格的唯一性确实很重要吗?

  • 如果没有,请尽可能实施解决方案3(例如使用URL encoding)。
  • 如果,您需要"父母"在任何情况下都是表,因此DBMS可以强制执行唯一性。
    • 您仍然可以尝试在此基础上实施解决方案3,
    • 在那里添加类型鉴别器 1 ,您将能够(快速)知道任何表引用了哪个表给出ID。

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