优化困境

时间:2014-04-14 19:03:46

标签: php mysql sql mysqli

我怀疑最优化的是什么。我正在建立一种“社交网络”。用户可以上传:照片almbums,文件或消息。每个数据都保存在不同的表中。接收器保存为userId用逗号分隔,如下:“1,2,3,4,”。现在我想抓住为用户发送的所有内容。我有2种方法(我知道)这样做。

  1. 分别获取每个表(效率不高,因为我必须对从另一个表中获取deder发送者用户的每一行进行查询。)然后处理数据。

  2. 加入3个表格。但据我所知,我不能在JOIN中使用LIKE。

  3. 有什么想法吗?

    PS:我在php和mysql中这样做

3 个答案:

答案 0 :(得分:1)

您可以在JOIN中使用LIKE(请参阅how to use a like with a join in sql?),但如果我理解正确,您不应将接收器表示为以逗号分隔的字符串列表。而是使用另一个表,每个接收者 - 项目关系都有一个单独的记录,这样您就可以查询它而无需使用LIKE。

答案 1 :(得分:1)

您可以在like中使用join。您正在寻找的表达式如下:

on find_in_set(a.value, b.list) > 0

但是,不建议这样做,因为MySQL无法使用索引优化查询的性能。换句话说,列表中的项目应该是联结/关联表中的单独行。

如果你需要做这样的连接,那么你应该规范化你的数据结构。这意味着,不要将列表存储在逗号分隔的字段中。

答案 2 :(得分:0)

您想要的是图表数据库。

您可以选择为此目的而准备的内容,或尝试将图表映射到SQL数据库。

例如:

  • 用户表
  • sender-receiver表(两个用户的外键)
  • 项目扩展表(扩展发件人 - 收件人)

类似的东西:

CREATE TABLE user (varchar user_id, varchar email, etc...);
CREATE TABLE link (varchar sender, varchar recepient)
   CONSTRAINT FOREIGN KEY (sender) REFERENCES user (user_id)
   CONSTRAINT FOREIGN KEY (recepient) REFERENCES user (user_id);
CREATE TABLE aldbum (varchar sender, varchar recepient, album stuff)
   CONSTRAINT FOREIGN KEY (sender, receipient) REFERENCES link (sender, recepient);
-- repeat extension tables for files, messages