得到三个实体 -
- 用户 - 拥有用户名/密码、联系信息、账单信息等。
- Periodical - 有 periodical_name、category、publisher_info、print_cycle、unit_price 等。
- 订阅 - 具有用户 ID、期刊 ID、订阅开始/结束日期、状态等。
和以下关系 -
- 用户可以订阅多个期刊。
- 订阅属于一个用户,并且有一个关联的期刊。
- 定期有许多与之关联的订阅。
s.t.,
- 用户--订阅关系是一对多的,
- 定期--订阅关系是一对多,
我的问题--
此模型描述对于通常发现的现实世界关系是否正确?
或者,将 Periodical 合并为 Subscription 是否更好,特别是如果每个 Periodical 信息不广泛并且可以编码到分隔符单独的文本字段中(例如“PeriodicalName:Frequency:Publisher:UnitPrice”) ?
我可以说通过关联性 User--Periodical 关系是多对多的吗?
如果有人可以展示我如何对用户或订阅表施加约束(假设我不折叠订阅和期刊),我将不胜感激,s.t.当出于某种原因需要删除用户时,所有关联的订阅也将被删除。
想要将用户记录保留一段时间(比如一年),即使在所有订阅都已过期之后,所以我想我可以将 NULL 分配给用户表中的 FK subscription_id,对吗?这是订阅表中没有相应记录的情况。
最佳答案
是。
您描述的“非规范化”在极少数情况下可能有用,但它违反了关系设计。
是的。
这种类型的约束(一对一)在大多数 RDBMS 产品中并未以声明方式实现。相反,我们有 1 到 0 或 1。您可以使用触发器来完成,但这很棘手且微妙。 Google for Object-Role Modeling,这是一种更全面的建模技术,可以解决类似这样的问题(以及“非此即彼”和“至少 2 个”以及许多其他问题。)
这将是处理它的标准方法。您还可以为订阅留一个到期日期。但是 1 到 0 或 1 的不足很好地促进了你的建议。
关于mysql - 如何为这个和等效的 SQL 建模——用户、订阅、期刊,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8022128/