考虑以下表格:
讯息
+-----------+------------+----------+----------------+
| messageId | fromUserId | toUserId | messageContent |
+-----------+------------+----------+----------------+
| 1 | 1 | 2 | Hello |
+-----------+------------+----------+----------------+
用户
+--------+----------+
| userId | userName |
+--------+----------+
| 1 | magnus |
| 2 | fabiano |
+--------+----------+
但是当我必须显示任何消息时,我将需要userName
以及消息属性。
最佳方法是什么:
将专栏userName
添加到消息? (单表查询,但是会影响规范化)
按上述规则进行标准化(并有两个表查询)
感谢。
答案 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)
由于这是消息历史表,我相信几天之后它会很大。复制用户名只是为了显示将是完全错误的,因为这将占用不必要的空间。
另外想一想,如果用户更新了他的名字,那么你只需要为一个用户更新这个数千/十万行的表。
关于名称的显示,即使我不会加入表格。我将在单独的查询和编程中获得名称,我将使用该变量在聊天中显示。