【发布时间】:2012-01-05 21:40:49
【问题描述】:
我目前正在将开源聊天 (AJAX Chat) 集成到另一个项目中。现在,默认情况下,聊天只是从文件中获取其有效用户和有效频道,但显然当您拥有一个用户不断变化的数据库时,这并不理想。
所以,我想让聊天直接从数据库中加载用户和频道信息。我在想设计应该如下(如果你有不同的感觉,请告诉我):
- 我们有一些聊天渠道(公共、营销等)
- 然后我们将组分配到渠道(例如 PR 团队 1、IT 人员等...)
- 然后我们的用户属于组,并且在某些情况下被直接分配到频道。
我正在考虑用这样的表格来实现上述内容:
频道表:
|----|Channel_Name||Channel_ID||Groups_Assigned||Users_Assigned|----|
|----|---Public---||-----0----||---1,2,3,4,5---||-----3,4------|----|
.
.
.etc...
注意:组分配表包含分配给频道的组的组 ID,而分配的用户包含不属于分配组的用户的 ID。
组表:
|----|Group_Name||Group_ID||Users_Assigned|----|
|----|---Team1--||----0---||------5,10----|----|
.
.
.etc...
抱歉,表格画得不好。
现在,通过上述实现,当用户登录时,程序将获取用户 id(从 users 表中),然后在 groups 表中搜索包含该用户 id 的所有组,最后搜索所有频道的频道表,这些频道包含组(用户所属的组)或用户直接分配给他们的频道。
我的想法是可以的,但是好像有点,呃,效率低下。因为我必须以1,2,3.... 格式存储分配的ID(组和用户),所以我必须使用PHP 的explode() 或其他一些可以搜索字符串的PostgreSQL 函数。我很可能会存储一组组,然后循环遍历它们,一次一行,这对我来说似乎真的很慢。
或者,我可以为每个用户创建一个布尔列,但这会导致列太多,而且我不想在每次创建用户时都创建一个新列。
那么,你们会怎么做呢?而且,如果出于某种疯狂的原因,您碰巧同意我最初的想法,那么您能否帮我弄清楚如何实际编写代码来实际执行它。
感谢您的宝贵时间,祝您有美好的一天。
【问题讨论】:
-
你的直觉是正确的,这不是一个好的设计。阅读此 is-storing-a-comma-separated-list-in-a-database-column-really-that-bad:stackoverflow.com/questions/3653462/…
标签: php sql database postgresql database-design