【发布时间】: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
- 创建对象表来保存所有 uniqe id 和数据类型
- 在所有表上为 AFTER INSERT 创建触发器,以在对象表中创建具有其数据类型的行,该数据类型已插入到选定表中
- 如果需要,然后执行select语句来查找id所属的表名。
第二种解决方案是双插入。 1 将行插入到具有完整数据的实际表中,2 插入用于在我们在步骤 1 中创建的对象表中插入唯一 id 和表名。
select type from object_table where id = {primary_key_id}
解决方案 3
- 添加表名 + id = 编码为新的唯一整数 - 使用 php
- 解码 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