很基础的数据库理论

时间:2011-03-06 23:55:28

标签: database-design

我有一组表格来显示下面的组织与支持者之间的关系。虽然我已经做了一些基本的mySQL查询,但我对数据库的“设计”知之甚少。

我打算在数据库中查询:

  • 特定组织的贡献者列表......或,
  • 特定支持者支持的组织列表。

组织和贡献者的数据库表可能在将来有其他列,并根据该信息接收较少量的查询。

A | X  
A | Y  
A | Z  
B | X  
B | Y  
C | X  
C | Z

如何设置表格?我假设应该有第三个表,但第三个表中仍有冗余信息。有没有更好的方法来设置表格?

+----+-------+    +-------------+----------+   +----+-------+  
| id | org   |    | org         | contr    |   | id | contr.|  
+----+-------+    +-------------+----------+   +----+-------+  
|  1 |   A   |    |           1 |        1 |   |  1 | X     |  
|  2 |   B   |    |           1 |        2 |   |  2 | Y     |  
|  3 |   C   |    |           1 |        3 |   |  3 | Z     |  
+----+-------+    |           2 |        1 |   +----+-------+  
                  |           2 |        2 | 
                  |           3 |        1 |  
                  |           3 |        3 |  
                  +-------------+----------+  

5 个答案:

答案 0 :(得分:3)

你的解决方案是完全可以接受的,我无法看到哪里有任何冗余信息。这是表示多对多关系的常规方式。您的第三个表在关系数据库中称为联结表。

答案 1 :(得分:2)

这被称为多对多关系,或者你通常如何遇到它:M:N。第三个表没有办法,虽然它包含冗余信息,但它遵循关系数据库的设计规则。

是的,有一些权衡,但是当你将技术推出舒适区时,你会得到这些权衡。如果您希望将冗余保持在最低限度,那么NoSql解决方案可能值得研究,但是,这可能会迫使您失去RDBMS的许多优点。你必须权衡你的选择,并选择最适合你的存储设施。

答案 2 :(得分:1)

3个起始表:贡献者,支持者,组织。

- >组织有许多贡献者意味着如果贡献者有一个组织,您只需将organization_id设置为贡献者表。如果它可以有很多组织,那么你需要第三个表,比如具有(organization_id,contributor_id)的organization_contributors。

- >一个组织有许多支持者与上述完全相同:)

答案 3 :(得分:1)

您有典型的MN关系。这是组织和贡献者之间的多对多关系。

由于数据库引擎通常不支持这种关系,因此您需要第三个表。此连接表将这一关系减少为两个1M关系(一对多)。

贡献者1:M ContributorOrganization M:1组织

答案 4 :(得分:1)

按照你的建议设置3个表,例如:

CREATE TABLE supporters ( 
   supid INTEGER PRIMARY KEY,  
   name VARCHAR(32)  
);

CREATE TABLE organizations ( 
  orgid INTEGER PRIMARY_KEY,   
  name VARCHAR(32) 
);

CREATE TABLE supports ( 
   supid INTEGER NOT NULL,    
   orgid INTEGER NOT NULL,    
   FOREIGN KEY(supid) REFERENCES supporters(supid),    
   FOREIGN KEY(orgid) REFERENCES organzations(orgid) 
);

然后,您可以创建支持者和组织,并将两者的ID添加到支持表中。 (注意:SQL将在sqlite中运行,但它仅用于演示目的)。对于属于组织的每个支持者,请在支持表中添加其支持者ID和组织ID。

这里没有冗余;不要担心重复id;他们需要建立支持者和组织之间的关系。

您添加到支持者和组织表的列越多,“看起来就越不冗余”。