在主键中具有可空列的替代方法

时间:2016-02-11 10:03:45

标签: mysql

我有一个论坛,用户可以在创建新主题时订阅接收通知。他们可以在论坛中为每个类别单独订阅。还应该可以订阅所有类别,这样如果他们想要接收所有类别的通知,他们就不必指定每个类别。 (并且还可以自动接收可能在将来创建的任何新类别的通知。)也可以在不同级别订阅。例如,可以只订阅新线程的通知,或者除了通知之外,还可以自动订阅新线程,同时也可以在线程中的新帖子上接收通知。

我的第一个想法是创建一个包含UserIdCategoryIdLevelId的表格,(UserId, CategoryId)PRIMARY KEY。如果CategoryIdNULL,则表示所有类别。这将允许对所有类别进行基本订阅,然后可以针对特定类别单独更改订阅级别。

+--------+------------+---------+
| 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作为用户订阅的类别的位掩码。如果CategoriesCategories,则可能表示所有类别。此方法不允许基本订阅,由个别订阅重载。此外,所有类别都需要相同的订阅级别,NULL上不能有FOREIGN KEY

Categories

有没有更好的建议来解决这个问题?

0 个答案:

没有答案