php - 在 PostgreSQL 中存储一对多或多对多关系的最佳方式是什么?

标签 php sql database postgresql database-design

我目前正在将开源聊天(AJAX 聊天)集成到另一个项目中。现在,默认情况下,聊天仅从文件中获取其有效用户和有效 channel ,但显然当您的数据库包含不断变化的用户时,这并不理想。

所以,我想让聊天直接从数据库加载用户和 channel 信息。我在想设计应该如下(如果你有不同的感觉,请告诉我):

  • 我们有一些聊天 channel (公共(public)、营销等...)
  • 然后我们将小组分配给 channel (如公关团队 1、IT 人员等...)
  • 然后我们有属于组的用户,在某些情况下直接分配给 channel 。

我正在考虑使用如下表格实现上述内容:

channel 表:

|----|Channel_Name||Channel_ID||Groups_Assigned||Users_Assigned|----|  
|----|---Public---||-----0----||---1,2,3,4,5---||-----3,4------|----|  
.  
.  
.etc...

注意:分配组表包含分配给 channel 的组的组 ID,而分配的用户包含不属于分配组的用户的 ID。

组表:

|----|Group_Name||Group_ID||Users_Assigned|----|  
|----|---Team1--||----0---||------5,10----|----|  
.  
.  
.etc...  

抱歉,表格绘制得很糟糕。

现在,通过上面的实现,当用户登录时,程序将获取用户 ID(从 users 表中),然后搜索 groups 表以查找包含该用户 id 的所有组,最后,搜索包含组(用户所属的)或用户直接分配给它们的 channel 的所有 channel 的 channel 表。

我的想法是可以的,但是好像有点,呃,效率低下。由于我必须以 1,2,3.... 格式存储分配的 ID(包括组和用户),因此我将不得不使用 PHP 的 explode() 或其他一些可以搜索字符串的 PostgreSQL 函数。我很可能会存储一组组,然后循环遍历所有组,一次一行,这对我来说真的很慢。

或者,我可以为每个用户设置一个 bool 值列,但这会导致列太多,而且我不想在每次创建用户时都创建一个新列。

那么,你们会怎么做呢?而且,如果出于某种疯狂的原因,你碰巧同意我最初的想法,那么你能帮我弄清楚如何实际编写代码来实际执行它吗。

谢谢你的时间,祝你有美好的一天。

最佳答案

是的,存储以逗号分隔的数字字符串并尝试在数据库中搜索给定数字是低效的。有关更多信息,请参阅我对 Is storing a comma separated list in a database column really that bad? 的回答

相反,您应该使用交集表 来存储用户和组之间以及组和 channel 之间的多对多关系。然后您的搜索将从索引中受益,您可以使用连接返回组或 channel 表。

关于php - 在 PostgreSQL 中存储一对多或多对多关系的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8261812/

相关文章:

javascript - ng-repeat 在遍历 JavaScript 对象数组时不起作用

php - 如何测试 Web 应用程序的内存泄漏?

sql - 是否有任何 VSCode 扩展可以连接到 BigQuery?

sql - 如何进行多分组并输出到 CSV

php - 如何使用 php 连接到所有类型的数据库?

PHP If() .. Else if () Then Insert 不工作

java - 如何确定汽车在图像中的位置?

php - 为我的 ERP 系统进行销售统计,但性能很差

java - java在内存中存储数据的数据库是哪个?

python - 用 pre_save() 填充 django 字段?