zer*_*rmy 4 php sql database postgresql database-design
我目前正在将开源聊天(AJAX Chat)集成到另一个项目中.现在,聊天默认只从文件中获取有效用户和有效频道,但是当你拥有一个不断变化的用户数据库时,这显然不是理想的.
所以,我想这样做,以便聊天直接从数据库加载用户和频道信息.我认为设计应该如下(如果你有不同的感受,请告诉我):
我正在考虑使用以下表格实现上述内容:
频道表:
|----|Channel_Name||Channel_ID||Groups_Assigned||Users_Assigned|----|
|----|---Public---||-----0----||---1,2,3,4,5---||-----3,4------|----|
.
.
.etc...
Run Code Online (Sandbox Code Playgroud)
注意:分配的组表包含分配给通道的组的组ID,而分配的用户包含不属于分配的组的用户的ID.
群组表:
|----|Group_Name||Group_ID||Users_Assigned|----|
|----|---Team1--||----0---||------5,10----|----|
.
.
.etc...
Run Code Online (Sandbox Code Playgroud)
对不起画的桌子很抱歉.
现在,通过上面的实现,当用户登录时,程序将获取用户id(来自users表),然后在groups表中搜索包含用户id的所有组,最后搜索通道表对于包含组(用户所属的组)或直接分配给用户的通道的所有通道.
我的想法是可能的,但似乎有点,呃,效率低下.因为我必须以格式存储指定的ID(组和用户),所以1,2,3....我必须使用PHP explode()或其他一些可以搜索字符串的PostgreSQL函数.我很可能会存储一组数组,然后一次循环遍历它们,这对我来说似乎很慢.
或者,我可以为每个用户创建一个布尔列,但这会导致列太多,并且我不想在每次创建用户时创建新列.
那么,你们会怎么做呢?而且,如果出于某种疯狂的原因,你碰巧同意我最初的想法,那么你能帮我弄清楚如何实际编写代码来实际做到这一点.
谢谢你的时间,祝你有个美好的一天.
是的,存储以逗号分隔的数字字符串并尝试在数据库中搜索给定数字是低效的.有关这方面的更多信息,请参阅我的答案是否在数据库列中存储逗号分隔列表真的那么糟糕?
相反,您应该使用交集表来存储用户和组之间以及组和通道之间的多对多关系.然后,您的搜索将受益于索引,您可以使用联接返回到组或通道表.