微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在数据库域建模方面处理 3NF,其中添加属性,知道它们会创建传递依赖

如何解决在数据库域建模方面处理 3NF,其中添加属性,知道它们会创建传递依赖

我目前正在建立一个数据库域模型,在规范化方面,由于传递依赖,我将面临挑战。然而,对于这个特定的模型,我们选择添加这种传递依赖是有原因的,我想知道你会如何在规范化方面处理这种情况?

让我说明我的意思:

我有一个名为 UserSubscription 的表,它具有以下属性

id {dbgenerated}
created
user
price
currency
subscriptionid

值:

price
currency

取决于subscriptionid,它指向第二个表Subscription(其中subscriptionid 是对该表PK 的FK 引用)。有人可能会说为什么,我什至会考虑将 Subscription 表中的重复值包含到 UserSubscription 表中吗?嗯,原因是 Subscription 可能会在任何时间点发生变化,作为参考,我们希望将订阅的原始值存储在 UserSubscription 中,这样即使它发生变化,我们仍然拥有用户最初注册

我知道从规范化的角度来看,我创建的这个传递依赖应该是固定的,理想情况下我会将值移回订阅表中,只是不允许修改值,而是创建一个新的订阅必要时。

但理想情况下,我不想在现有订阅中每次需要更改时创建新订阅,仅仅是因为预计这些更改会经常发生 - 以下是市场竞争价值。同时,每创建一个订阅,任何用户都会有更多选择。

这也意味着,如果我们不想再使用订阅,我们需要:删除,然后创建一个订阅。这可以通过简单的更新解决,因为无论如何我们都不再需要旧的了。

以上是一个学校项目,我只是想知道在规范化方面选择这种方法是否“确定”,当我选择这样做时,并减少与删除和创建新的相关的任务订阅,而我预计这些会经常更改。

解决方法

为什么不创建一个 M:N 表(映射表)USER_SUBSCRIPTION,您将在其中拥有 USER 和 SUBSCRIPTION 之间的关系?您可以将所有值历史地存储在那里,并且不必删除/创建任何更改。如果用户决定选择退出,您只需更新 flag_active、flag_deleted、flag_dtime_end,任何对您有用的...

这是一个简单的演示模型:

USER
id_user PK
name
... other details

SUBSCRIPTION
id_subscription PK
name
details
flag_active (TRUE|FALSE or 1|0 values)
... other details

USER_SUBSCRIPTION
id_user               FK
id_subscription       FK
dtime_start       -- when the subscription started
dtime_end         -- when the subscription ended
flag_valid (T|F or 1|0)  -- optional,will give you a quick headsup about active subscriptions ... but this is sort of redundant,for you can get it from the dtime_start vs dtime_end .. up to you

这将为您提供一个非常通用(因此灵活/可扩展)的模型来处理用户订阅......没有重复,全部由 FK/PK 引用约束处理......等等

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。