我有一组表格来显示下面的组织与支持者之间的关系。虽然我已经做了一些基本的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 |
+-------------+----------+
答案 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;他们需要建立支持者和组织之间的关系。
您添加到支持者和组织表的列越多,“看起来就越不冗余”。