0

我对 MySQL 很陌生,我知道大多数基本功能以及如何发送查询等。但是,我正在尝试学习如何构建它以优化搜索用户信息,并想获得一些想法。

现在我只有一个名为 user_info 的表(用于功能目的和测试),它保存用户信息,另一个表存储链接到用户的照片。理想情况下,id 喜欢大多数此类信息,以便尽可能快地访问

在创建一个主要用于存储和检索用户信息(姓名、年龄、电话、消息等)的数据库时,为每个存储所有信息的新用户创建一个新表是一个好主意,这样一个表user_info 不会因多次查询、锁定等而陷入困境。例如,用户 john smith 将在数据库中拥有自己的表,其中包含他的所有信息,包括照片、消息等。

或者

最好只有几个表,例如 user_info、user_photos、user_messages 等。并以这种方式访问​​数据。

我不担心表格中的冗余,例如用户电子邮件地址被重复多次。

4

3 回答 3

1

后者是最好的方法。您为用户声明一个表,并为您想要的数据声明几列。

现在,如果您希望用户拥有照片,则需要一个带有照片的新表和一个链接到用户表的Primary Key的外键属性。

于 2012-07-27T02:42:20.250 回答
1

您绝对不应该为每个用户创建一个新表。为 user_info 创建一张表,如果每个用户可以拥有多张照片,则为照片创建一张表。一个消息表可能包含两个 user_id 列(user_to、user_from)和一个消息列。尽量规范化数据。

Users
====
id
email
etc

Photos
====
id
user_id
meta_data
etc

Messages
====
id
user_id_to
user_id_from
message
timestamp
etc
于 2012-07-27T02:42:32.710 回答
0

我同意这里提供的两个答案,但他们还没有提到的一件事是查找表。

考虑这里的一般示例:您有一个用户表和一个照片表。现在您想在您的网站上引入一项功能,允许用户“收藏”其他用户的照片。

与其创建一个名为“Favorites”的新表并重新添加有关图像的所有数据(字段位置、元数据、分数/其他),不如创建一个有效地位于其他两个表之间的表。

+-----------------------+      +-------------------------------------+
| ++ users              |      | ++ photos                           |
| userID | email | name |      | photoID | ownerID | fileLo | etc... |
+--------+-------+------|      +---------+---------+--------+--------+
| 1      | ....  | Tom  |      | 35      | 1       | .....  | .......|
| 2      | ....  | Rob  |      | 36      | 2       | .....  | .......|
| 3      | ....  | Dan  |      | 37      | 1       | .....  | .......|
+--------+-------+------+      | 43      | 3       | .....  | .......|
                               | 48      | 2       | .....  | .......|
                               | 49      | 3       | .....  | .......|
                               | 53      | 2       | .....  | .......|
                               +---------+---------+--------+--------+

+------------------+
| ++ Favs          |
| userID | photoID |
+--------+---------+
| 1      | 37      |
| 1      | 48      |
| 2      | 37      |
+--------+---------+

使用这种方法,您可以干净、高效地链接您拥有的数据,而无需过多的数据复制。

于 2012-07-27T03:43:53.087 回答