CRM Releationships MySQL



我们公司正在开发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         |
+----+-----------+------------+

等等。

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

谢谢你们的帮助,伙计们:)

所以我的问题是处理大量关系的最佳方式是什么?

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

每个"M:N"关系都应该用它自己的连接表来表示。OTOH,"1:N"关系不需要额外的表——只需要在"N"边的表中有一个合适的外键。

如果我正确理解你的描述,第三个选项可以模拟公司和个人之间的1:N关系。如果你想为它们之间的M:N关系建模,你会有一个连接表:company_person ( company_id, person_id, PK (company_id, person_id) )

还有其他方法吗?

有时,继承(也称为类别、子类型、泛化层次结构等)可以用来减少可能的"相关"组合的数量。简言之,与父母建立关系,然后从父母那里继承的每个孩子都会自动参与到这种关系中。

举个例子,看看这篇文章。

缺点/优点是什么?

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

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

有没有一种特殊的方式来处理他们的关系?

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

也许,你想看看:

  • ERwin方法指南
  • 使用索引,卢克

说到性能,不要猜测测量实际数据量。

最新更新