Mysql 我应该重新设计我的桌子还是我可以让它工作?
现在我正在努力将我的网站扩展到新的功能。我想启用来自不同来源的通知。类似于facebook上的群组和个人。这是我现在的桌子布局Mysql 我应该重新设计我的桌子还是我可以让它工作?,mysql,Mysql,现在我正在努力将我的网站扩展到新的功能。我想启用来自不同来源的通知。类似于facebook上的群组和个人。这是我现在的桌子布局 course_updates id | CRN (id of course) | update_id ------------------------------------ courses id | course_name | course_subject | course_number ----------------------------------------
course_updates
id | CRN (id of course) | update_id
------------------------------------
courses
id | course_name | course_subject | course_number
-------------------------------------------------
users
id | name | facebook_name
---------------------------------------------------
user_updates
id | user_id | update_id
------------------------
updates
id | timestamp | updateObj
---------------------------
我希望能够在一个查询中获取课程更新和用户更新,并将它们与更新以及表的正确信息结合起来。因此,对于课程更新,我需要课程名称、课程主题等。对于用户更新,我需要用户名和facebook名称。老实说,这可能属于两个单独的查询,但我希望按照updates表的时间戳来安排所有内容,而且我觉得用php对所有内容进行排序效率很低。最好的方法是什么?如果我要使用类似联合的东西,我需要一种方法来区分通知类型,因为用户更新和课程更新可以在更新中存储对同一列的引用。有什么想法吗?我认为你不应该在一个查询中把这两个概念(用户和课程)混合在一起。它们有不同的列数,涉及不同的概念 我认为您真的应该使用两个查询。一个用于用户,一个用于课程
SELECT courses.course_name, courses.course_subject, courses.course_number,
updates.updateObj,updates.timestamp
FROM courses, updates, course_updates
WHERE courses.id = course_updates.course_id
AND course_updates.udpate_id = updates.id
ORDER BY updates.timestamp;
SELECT users.name,users.facebook_name,updates.updateObj,updates.timestamp
FROM users ,updates, user_updates
WHERE users.id = user_updates.user_id
AND user_updates.update_id = updates.id
ORDER BY updates.timestamp;
您可能根本不需要更新表。您可以在
课程更新
和用户更新
表中包含时间戳列
CREATE TABLE course_updates
(
`id` int,
`CRN` int,
`timestamp` datetime -- or timestamp type
);
CREATE TABLE user_updates
(
`id` int,
`user_id` int,
`timestamp` datetime -- or timestamp type
);
现在,为了获得所有更新的有序的、按列的统一结果集,您可能会发现将每个更新类型的更新详细信息打包成一个分隔字符串(使用CONCAT_WS()
)放在一列中(我们称之为details
),插入一列以区分更新类型(我们称之为obj_type
)并使用UNION ALL
SELECT 'C' obj_type, u.id, u.timestamp,
CONCAT_WS('|',
c.id,
c.course_name,
c.course_subject,
c.course_number) details
FROM course_updates u JOIN courses c
ON u.CRN = c.id
UNION ALL
SELECT 'U' obj_type, u.id, u.timestamp,
CONCAT_WS('|',
s.id,
s.name,
s.facebook_name) details
FROM user_updates u JOIN users s
ON u.user_id = u.id
ORDER BY timestamp DESC
样本输出:
| OBJ_TYPE | ID | TIMESTAMP | DETAILS |
-------------------------------------------------------------------------
| C | 3 | July, 30 2013 22:00:00+0000 | 3|Course3|Subject3|1414 |
| U | 2 | July, 11 2013 14:00:00+0000 | 1|Name1|FB Name1 |
| U | 2 | July, 11 2013 14:00:00+0000 | 3|Name3|FB Name3 |
...
|OBJ|U类型| ID |时间戳|详细信息|
-------------------------------------------------------------------------
|C | 3 | 2013年7月30日22:00:00+0000 | 3 |课程3 |科目3 | 1414|
|U | 2 | 2013年7月11日14:00:00+0000 | 1 |名称1 | FB名称1|
|U | 2 | 2013年7月11日14:00:00+0000 | 3 |名称3 | FB名称3|
...
这里是演示
然后,在php中迭代resultset时,您可以轻松地分解详细值。如果要合并这两个表,您需要记住两件事:
SELECT * FROM
(SELECT courses.course_name as name, courses.course_subject as details,
updates.updateObj as updateObj, updates.timestamp as timestamp,
"course" as type
FROM courses, updates, course_updates
WHERE courses.id = course_updates.course_id
AND course_updates.udpate_id = updates.id)
UNION ALL
SELECT users.name as name,users.facebook_name as details,
updates.updateObj as updateObj,updates.timestamp as timestamp,
"user" as type
FROM users ,updates, user_updates
WHERE users.id = user_updates.user_id
AND user_updates.update_id = updates.id) as out_table
ORDER BY out_table.timestamp DESC
类型
可以让您区分用户更新和课程更新,并且前端可以使用它为行添加不同的颜色。course\u id
不会出现在这里,但您可以添加它,但请记住,您必须向user select语句添加一些伪文本,以确保两个查询返回相同数量的行。请注意,如果有同时涉及用户和课程的更新,它将出现两次
您也可以按
类型排序
,以区分用户和课程数据。用户和课程是否可以引用同一更新,或者更新表是否始终具有不同的用户和课程数据。用户和课程可以引用同一更新。如果用户和课程引用同一更新,最终输出中会有2行吗?我正在考虑将细节存储在JSON对象中。这是个坏主意吗?事实上,我想我知道你现在在做什么了。在查询中,您无法在MySql中以JSON格式存储详细信息,因为您无法正常查询数据。而是在客户端生成它。它很快,很容易,而且在db端和php端都有所有的方法和工具。@user2605381有帮助吗?你需要更多的帮助来回答你的问题吗?这很有帮助,但我可以看到,如果用户在数据字段中输入“where to”,问题会出现在哪里。我想我会重新设计我的数据库。