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

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

我们的数据库包含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

所有数据都链接到{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和数据类型
  • 在插入后的所有表上创建触发器,以在对象表中创建其数据类型为的行,该数据类型已插入到选定表中
  • 必要时,执行select语句以查找id所属的表名 第二种解决方案是双重插入。1个insert用于将行插入到包含完整数据的实际表中,2个insert用于将唯一id和表名插入到我们在步骤1中创建的对象表中

    select type from object_table where id = {primary_key_id}
    
    解决方案3

  • prepend table name+id=编码为新的唯一整数-使用php
  • 解码id并使用表名获取原始id(即使其与数字类型相同)

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

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

    您不需要跨五个DB表使用唯一ID,每个表只需要一个ID。您有两个选项可以选择如何创建链接(您可以自己创建链接,可以吗?):

  • 使用GET变量:
    http://domain.com/page.html?pk={id}&table={table}
  • 使用普通URL:
    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的意思,以及我试图实现的内容。