【问题标题】:Codeigniter disallow identical table rowsCodeigniter 不允许相同的表行
【发布时间】:2011-07-10 14:58:29
【问题描述】:

我有下表,允许用户将其他用户添加为朋友

+----+-------------+-------------------+
| ID | User_ID     | Friend_ID         |
+----+-------------+-------------------+
| 1  | 102         | 213               |
| 2  | 64          | 23                |
| 3  | 4           | 344               |
| 4  | 102         | 213               |
| 5  | 102         | 90                |
| 6  | 64          | 88                |
+----+-------------+-------------------+

请注意,用户 102 已添加用户 213 两次。我想禁止重复的行。使用活动记录,如果用户已经是朋友,我如何禁止将用户添加为朋友?

【问题讨论】:

  • 你有数据库设计问题!按照其他人的建议编辑您的数据库,当尝试将重复的行插入数据库时​​,您会遇到错误。然后您可以捕获这些错误。并显示相应的失败信息

标签: mysql database codeigniter database-design


【解决方案1】:

显然,您使用id 作为表的主键。我可以建议使用一个复杂的主键,结合所有的表字段。这仍然不是一个好的设计方法。作为替代方案,您可以进行表格分解。

【讨论】:

  • 或者只是删除 ID 列并在剩余的两个列上创建复合主键。
  • 在user_ID 和friend_ID 列上使用唯一约束会是更好的选择吗?
  • @Cyber​​Junkie。我不这么认为,因为它会导致额外的冗余。如果主键可以完成相同的工作,则没有理由使用unique。此外,Id 列似乎没用。因此,具有复合主键的两列表 (user_id,friend_id) 可能是最好的解决方案。
  • @tyz,我认为具有主键的列只能保存唯一的ID,所以更多的用户不能成为具有相同用户ID的朋友,如果相同的ID再次出现在Friend_ID列中.这是假的吗?
  • @Cyber​​Junkie,你是对的,主键只包含唯一值。但是你应该深入了解更多细节。通常,主键是列集中的值的组合。简单主键包括来自单个列的值。复合的包括几个列。因此,如果对应的Friend_ID 值不同,则该表可以包括几个相同的User_ID 值。反之亦然 - 如果对应的 User_ID 值不相同,则可能有多个相同的 Friend_ID 值。唯一重要的是 - 整个值集应该是唯一的。
猜你喜欢
  • 2011-07-07
  • 1970-01-01
  • 2013-04-22
  • 1970-01-01
  • 2019-03-19
  • 1970-01-01
  • 1970-01-01
  • 2014-07-02
  • 2011-05-05
相关资源
最近更新 更多