sql - 单表查询与规范化

时间:2015-02-11 13:08:46

标签: mysql

考虑以下表格:

讯息

+-----------+------------+----------+----------------+
| messageId | fromUserId | toUserId | messageContent |
+-----------+------------+----------+----------------+
| 1         | 1          | 2        | Hello          |
+-----------+------------+----------+----------------+

用户

+--------+----------+
| userId | userName |
+--------+----------+
| 1      | magnus   |
| 2      | fabiano  |
+--------+----------+

但是当我必须显示任何消息时,我将需要userName以及消息属性。

最佳方法是什么:

  1. 将专栏userName添加到消息? (单表查询,但是会影响规范化)

  2. 按上述规则进行标准化(并有两个表查询)

  3. 感谢。

5 个答案:

答案 0 :(得分:0)

有两个表查询。您有两个完全不同的实体 - 用户和消息。用户的一个属性是他们的“名称”。它们可以有许多其他属性,例如创建用户时,实名,别名等。

MySQL可以很好地处理连接,尽管你可能需要学习一些关于索引的知识。

答案 1 :(得分:0)

在大多数情况下,您应该将其标准化并在查询中将表连接在一起,并且您可以创建一个为您执行连接的视图,这样您只需查询视图。
采用标准化方法可能会为您节省长期更新/维护数据的问题

一般来说,只有当您开始使用大型数据库和/或商业智能时,您才应该为了性能而担心非规范化,因为与难度和空间使用相比,连接中可能存在难以忍受的开销。反规范化。

答案 2 :(得分:0)

我认为你必须使用两个表,否则很多值将在消息表中重复(冗余)。您将需要user_id,因为两个用户可以具有相同的名称。如果您要删除用户表,您可以为用户提供唯一标识

答案 3 :(得分:0)

两者(ish)

添加一个显示未规范化数据的视图

e.g。

CREATE VIEW MessageDetails AS
SELECT f.userName AS fromUser,
       t.userName AS toUser,
       m.content AS content
FROM messages AS m
JOIN users AS f ON m.fromUserId = f.userId
JOIN users AS t ON m.toUserId = t.userId

答案 4 :(得分:0)

严格限制

由于这是消息历史表,我相信几天之后它会很大。复制用户名只是为了显示将是完全错误的,因为这将占用不必要的空间。

另外想一想,如果用户更新了他的名字,那么你只需要为一个用户更新这个数千/十万行的表。

关于名称的显示,即使我不会加入表格。我将在单独的查询和编程中获得名称,我将使用该变量在聊天中显示。