mysql - CRM 关系 MySQL

标签 mysql database-design orm entity-relationship crm

我们公司正在开发 CRM,现在我们到了必须决定如何处理关系的地步。这一点很重要,因为将会有很多。以后再改变结构就不太酷了..

我知道 3 种方法:

一张关系表:

我这样做的方法是创建一个包含所有关系的表。

Table: releationships

+----+-------------+-----------+--------------+------------+
| id | record_type | record_id | belongs_type | belongs_id |
+----+-------------+-----------+--------------+------------+
| 1  | person      | 42        | company      | 12         |
+----+-------------+-----------+--------------+------------+
| 2  | person      | 43        | company      | 12         |
+----+-------------+-----------+--------------+------------+
| 3  | note        | 23        | company      | 12         |
+----+-------------+-----------+--------------+------------+ 
| 4  | attachment  | 13        | company      | 12         |
+----+-------------+-----------+--------------+------------+

多个关系表:

我认为这就是 SugarCRM 的工作方式。

Table: company_realationships

+----+-----------+------------+--------+
| id | record_id | has_type   | has_id |
+----+-----------+------------+--------+
| 1  | 12        | person     | 42     |
+----+-----------+------------+--------+
| 2  | 12        | person     | 43     |
+----+-----------+------------+--------+
| 3  | 12        | note       | 23     |
+----+-----------+------------+--------+
| 2  | 12        | attachment | 13     |
+----+-----------+------------+--------+

全部在记录表中:

Table: person

+----+-----------+------------+
| id | name      | company_id |
+----+-----------+------------+
| 42 | luke      | 12         |
+----+-----------+------------+
| 43 | other guy | 12         |
+----+-----------+------------+

等等。

  • 所以我的问题是处理大量关系的最佳方法是什么?
  • 还有其他方法吗?
  • 有什么缺点/优点?
  • 高流量双方是否有一种特殊的方式来处理他们的关系?

谢谢你们的帮助:)

最佳答案

So my Question is wich is the Best way of handling lots of releationships?

第三个或它的变体(见下文)。

每个“M:N”关系都应由其自己的联结表表示。 OTOH,“1:N”关系不需要额外的表 - 只需要表中“N”一侧的适当外键。

如果我对你的描述理解正确,第三个选项模拟了公司和个人之间的 1:N 关系。如果有任何机会您想要在它们之间建立 M:N 关系模型,您将有一个联结表:company_person ( company_id, person_id, PK (company_id, person_id) )

Are there other ways to do it?

有时,继承(又名类别、子类型、泛化层次结构等)可用于减少可能的“相关”组合的数量。简而言之,与 parent 建立关系,然后从该 parent 继承的每个 child 都会自动参与该关系。

举个例子,看看this post .

What are disadvantages / advantages?

以声明方式强制执行约束(包括 FK)比通过触发器强制执行更好(不易出错并且可能性能更高),这又比在客户端代码中强制执行更好。

选择一个更符合该原则的设计。例如,您的选项 1 和 2 不允许 DBMS 以声明方式强制执行 FK。

Is there a special way how hightraffic sides handle their releationships?

良好的逻辑设计和良好的物理实现是良好性能的唯一坚实基础。很难在糟糕的设计上“补强”性能。

也许,你想看看:

关于性能,请不要猜测! 衡量实际数量的数据。

关于mysql - CRM 关系 MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13497342/

相关文章:

sql - 为什么我应该避免 SQL 数据库中的 NULL 值?

mysql - 有趣的数据库架构场景

android - Realm for Android 实际上是如何存储数据的?

java - Hibernate:如何维护插入顺序

php pdo 查询不适用于数组

php - 我在 laravel 中有一个表单,当我单击提交按钮时,它说 token 不匹配

database - 用于用户聊天的 Cassandra 表设计

python - Sqlalchemy:二次关系更新

android - 实时位置广播

java - 使用 Intellij 配置 JPA