0

我们的数据库包含 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 中实现这一点,但这个解决方案听起来更好!?你有什么建议?

4

2 回答 2

0

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

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

1看看这个答案的下半部分。这实际上是一种继承形式。

于 2013-04-23T23:00:55.380 回答
0

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

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

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

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

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

于 2013-04-23T19:04:35.157 回答