我有一个论坛,用户可以在创建新主题时订阅接收通知。他们可以在论坛中为每个类别单独订阅。还应该可以订阅所有类别,这样如果他们想要接收所有类别的通知,他们就不必指定每个类别。 (并且还可以自动接收可能在将来创建的任何新类别的通知。)也可以在不同级别订阅。例如,可以只订阅新线程的通知,或者除了通知之外,还可以自动订阅新线程,同时也可以在线程中的新帖子上接收通知。
我的第一个想法是创建一个包含UserId
,CategoryId
和LevelId
的表格,(UserId, CategoryId)
为PRIMARY KEY
。如果CategoryId
为NULL
,则表示所有类别。这将允许对所有类别进行基本订阅,然后可以针对特定类别单独更改订阅级别。
+--------+------------+---------+
| UserId | CategoryId | LevelId |
+--------+------------+---------+
| 1 | 1 | 2 |
| 1 | 2 | 2 |
| 1 | NULL | 1 |
| 2 | NULL | 2 |
+--------+------------+---------+
问题是PRIMARY KEY
的列部分不允许NULL
值。我当然可以使用单独的值,例如-1
作为"所有类别",但这会破坏FOREIGN KEY
上的CategoryId
。另一个想法是使用UNIQUE KEY
,它允许NULL
值,而不是PRIMARY KEY
,但是每个用户可能会有多行CategoryId = NULL
,因为{{ 1}} NULL != NULL
。
另一个想法是仅使用MySQL
作为UserId
创建一个表,并使用PRIMARY KEY
作为用户订阅的类别的位掩码。如果Categories
为Categories
,则可能表示所有类别。此方法不允许基本订阅,由个别订阅重载。此外,所有类别都需要相同的订阅级别,NULL
上不能有FOREIGN KEY
。
Categories
有没有更好的建议来解决这个问题?