mysql - 如何在MySQL数据库中实现 'Favorite'关系?

标签 mysql database schema relational-database database-schema

我有一个显示表演者和 field 列表的应用程序。该应用程序的用户可以选择“收藏”任意数量的每种类型。我想知道是否有一种标准方法可以在 MySQL 数据库中实现这一点。这是我的选择:

  1. 有一个表Favorite,存储UserID、Type、TypeID
    • 类型可以是“表演者”或“ field ”
  2. 有一个表Favorite,存储UserID、PerformerID、VenueID
    • 每个条目仅允许 PerformerIDVenueID 之一具有值
  3. 有两个表 Favorite_PerformerFavorite_Venue,每个表存储 UserID, PerformerIDUserID, VenueID
    • 我认为这将是“相对”地做到这一点的最佳方式。

每种方法的优点和缺点是什么?就 future 的可维护性而言,您会推荐哪种方法?谢谢。

最佳答案

选项 3 是最干净的。它使添加和删除收藏夹变得最简单。这就是 ORM 框架将实现的架构。

选项 1 是可行的,但您无法定义外键约束来强制完整性。向您的查询添加谓词 WHERE type='Venue',使得使用该表几乎就像使用单独的“Favorite_Venue”表一样。

选项 2 会使添加收藏项(如果已存在)变得复杂。 (这需要更新现有行,而不是插入。如果某人有两个最喜欢的 field 和五个最喜欢的表演者,那么会有多少行?但至少可以定义外键。

假设我们有两个最喜欢的 field 和两个最喜欢的表演者:

userID  venueID  performerID
------  ------- -----------
     1       11          177
     1     NULL          654
     1       12         NULL

当最喜欢的 field ID 11 被删除时,您将更新该行以将 field ID 设置为 NULL。但是,如果将venueID 12 从收藏夹中删除,您会将该列设置为 NULL,还是删除该行。当您要添加最喜爱的表演者时,您会更新 PerformerID 为 NULL 的现有行,还是会插入一行。并非不可行,但比较复杂。

如果我们有一条规则,规定只能填充venueID或performerID列之一,那么使用诸如WHEREvenueID IS NOT NULL之类的谓词将使使用该表几乎就像使用单独的表一样Favorite_Venue 表。

底线,我会选择选项 3,除非有一些令人信服的理由不这样做。


这不是“困惑”。每个表Favorite_Venue 和Favorite_Performer 都有一个目的,一个“raison d'etre”,一个它存在的原因。每个表都解析多对多关系。

将这两个独立的“关系”表组合成一个表实际上会造成困惑。如果我们添加一列来区分行(为了有效回答这个问题,该行真正属于哪个表),那么该列就会“困惑”。如果我们在同一行上使用两个单独的列来表示这两个关系,则会在处理添加或删除收藏夹的代码中造成困惑。

关于mysql - 如何在MySQL数据库中实现 'Favorite'关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17888406/

相关文章:

php - UTF-8贯穿始终

php - 变量 'sql_mode' 无法设置为“REPLACE”的值

Mysql INSERT 语法错误 #1064

database-design - MongoDB Schema Design - 许多小文档还是更少的大文档?

php - 我的架构与我的数据库不同

mysql - 如何判断MySQL查询是否有效?

mysql - 输出同一 SQL 表中不同列的不同行

mysql - 如何与其他团队成员共享MySQL数据库

mysql - sql中是否有像EXCEL中那样的ROUNDDOWN()函数

nhibernate - 即使有博客文章,也很难理解 nHibernate SchemaUpdate