Mysql 最佳实践:从多个表中查找唯一id的行
我们的数据库包含5个以上的表Mysql 最佳实践:从多个表中查找唯一id的行,mysql,database,database-design,database-schema,uniqueidentifier,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 us
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
所有数据都链接到{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
select type from object_table where id = {primary_key_id}
解决方案3
我不知道如何在php中实现这一点,但这个解决方案听起来更好!?你的建议是什么?我不知道你在评论中提到Facebook是什么意思,但我会进一步解释我的评论 您不需要跨五个DB表使用唯一ID,每个表只需要一个ID。您有两个选项可以选择如何创建链接(您可以自己创建链接,可以吗?):
http://domain.com/page.html?pk={id}&table={table}
http://domain.com/{id}{table}
当简单模型工作时,可以添加编码/解码/哈希函数。但是你真的需要它们吗?在什么层次?(我在这方面没有经验,所以我现在就闭嘴。)保持表间的唯一性真的很重要吗
- 如果否,如果可以,只需实施解决方案3(例如使用)
- 如果是,则在任何情况下都需要“父”表,以便DBMS可以强制执行唯一性。
- 除此之外,您还可以尝试实施解决方案3
- 或者在那里添加一个类型鉴别器1,您将能够(快速)知道针对任何给定ID引用哪个表
1.看一看机器的下部。这实际上是一种继承形式。您的两种解决方案都会起作用。问题更多的是你需要多久做一次有问题的手术。解决方案2可能更快,但需要一个额外的表,并且在插入时需要更高的成本。解决方案1更简单,但最多需要5条select语句。顺便问一下:你有没有想过使用带有“说话”号码的唯一ID?然后你可以从数字中知道原始表格。你如何创建链接?使您的链接类似于
http://domain.com/page.html?pk={id}&table={table}
(当您echo
链接将表添加为id之类的属性时)。稍后,您可以解析url并将表属性用作查询中的变量。表ID在整个数据库中不需要是唯一的。如果我没弄错的话,你是在浪费大量可用的ID号。@luksch我正在使用UUID_SHORT()为所有表创建唯一的ID。我更喜欢解决方案3,但不知道如何在其上实现编码/解码。你怎么想?@ZZ bb我正在尝试在数据上实现类似facebook api的实现。如果你可以将表定义更改为使用字符串作为主键,那么你可以在插入行时将id与表标识符字符串连接起来。向下滚动到“支持对象的示例”,您可以看到我在多个表中使用唯一id的意思,以及我试图实现的内容。