Mysql:如果可能的话,拆分表是否更好?

时间:2014-09-10 17:54:03

标签: mysql sql

为了让您理解我的问题,我会举个例子: 我有一个聊天网络应用程序与许多房间,让我们说5个房间。 人们可以选择只留在一个房间,他们在登录时选择它。

当他们选择房间时,我必须检索已经在房间里的人,所以我可以用两种方式构建我的数据库: 每个房间一张桌子,人们都是记录; 一张桌子上的所有房间,人们都是记录,还有一列表明他们所在的房间;

在第一种情况下,查询将是:

SELECT * FROM 'room_2' WHERE 1

在第二种情况下,查询将是:

SELECT * FROM 'rooms' WHERE room = 'room_2'

哪个最好? 我认为唯一要考虑的参数是性能,对吧?

2 个答案:

答案 0 :(得分:1)

在这个例子中,不,因为人们都喜欢'对象,因此应该在同一个表中。 在这个简单的例子中,一个表中的所有人和房间都有人的主键。 表会议室(pk_person,personName,table_id)

但我想讨论一下随着网站的发展你想要考虑的结构。你需要三个表,每个对象一个(聊天室,人),一个用于关系。

Chat_Rooms(pk_ChatId, ChatName, MaxOccupants, other unique attributes of a chat room)
People(pk_PersonID, FirstName, LastName, other unique attributes of a person)
Room_People_Join(pk_JoinId, fk_ChatId, fk_PersonID, EnterDateTime, ExitDateTime)

这是一种“高度规范化”的结构。每个表都是类似对象的集合,连接允许多对多关系,并且对象行不会重复。因此,具有所有属性(姓名,性别,年龄)的人员永远不会在人员表中重复。此外,人员表从不定义一个人所在的聊天室,因为一个人可能在一个,多个,没有,或者可能多次进入和退出。相同的概念适用于聊天室。聊天室的功能,如背景颜色,最大占用者等,与人无关。

Room_People_Join是重要的一个。这有一个独特的主键,一个人所在的聊天室和他们在那里的聊天室。该表无限增长,但它跟踪使用情况。包括关系表是逻辑上规范化数据库的。

那你怎么知道哪些用户目前在聊天室1?您将人员和房间加入到连接表中,并在FROM子句中使用各自的主键和外键,在SELECT子句中询问所需的列,并过滤聊天室1和尚未离开的人。

SELECT p.FirstName, p.LastName, r.ChatName
FROM Room_People_Join j
    JOIN People p ON j.fk_PersonID  = p.pk_PersonID
JOIN Chat_Rooms r ON j.fk_ChatId = r.pk_ChatId
WHERE r.ExitDateTime IS NOT NULL
    AND pk_ChatId = 1

很抱歉,这是长篇大论,但我推断了你的数据库增长问题。

答案 1 :(得分:0)

答案很简单,强烈建议 - 所有房间都有一个数据库表!如果您以后想要动态创建房间怎么办?当然,您不会动态创建新表。