我正在与使用 OAuth 的服务集成,我需要保存到数据库的数据非常相似。但是,与前两种实现方式略有不同。
它们都有一个令牌、过期时间、refreshToken 和 refreshTokenExpiration。但是,一个有一个“realmId”,另一个有一个需要保存的“redirectUri”。
在我看来,我有 3 个选择:
a) 将 realmId 和 redirectUri 添加到同一个表中,一个将被填充,另一个为空,具体取决于正在使用的服务。当然,谁知道我是否必须在添加更多具有不同要求的服务时继续添加其他列?
b) 规范化数据,使得相似数据有一个表,但单独的表保存每个服务的唯一数据,并具有与具有相似令牌数据的表的外键。
c) 甚至不必费心将相似的数据存储在单个表中。而是为每个服务创建一个完全独立的表。
作为一个实用主义者而不是理论家,我倾向于 c)。造成这种情况的另一个原因是,一项服务基于帐户授予令牌,而另一项服务基于可能跨越多个帐户的用户授予令牌。
我知道这肯定是一个常见问题,但我只是不知道如何描述这个问题,以便我可以在搜索中找到有关它的有用信息。
我建议两张桌子。我假设如果您在应用程序需要重定向 URL 时给它一个 realmID,它会破坏您的应用程序,因此您肯定需要将它们放在单独的列中。
如果您有两个应用程序使用两个单独的表,那么您可能会在死锁方面为自己省去一些麻烦。您可能还希望对每个应用程序的数据进行不同的处理。例如,您可能需要将redirectURL 保留5 天,将RealmID 保留2 个月。如果您尽早将事情分开,您将为未来的自己省去很多麻烦。
您始终可以为自己创建一个视图,将两个表联合起来,从而为您提供将数据放在一个表中的任何优点,而没有任何缺点。