mysql - 如何为这个和等效的 SQL 建模——用户、订阅、期刊

标签 mysql sql sql-server database database-design

得到三个实体 -

  1. 用户 - 拥有用户名/密码、联系信息、账单信息等。
  2. Periodical - 有 periodical_name、category、publisher_info、print_cycle、unit_price 等。
  3. 订阅 - 具有用户 ID、期刊 ID、订阅开始/结束日期、状态等。

和以下关系 -

  • 用户可以订阅多个期刊。
  • 订阅属于一个用户,并且有一个关联的期刊。
  • 定期有许多与之关联的订阅。

s.t.,

  • 用户--订阅关系是一对多的,
  • 定期--订阅关系是一对多,

我的问题--

  1. 此模型描述对于通常发现的现实世界关系是否正确?

  2. 或者,将 Periodical 合并为 Subscription 是否更好,特别是如果每​​个 Periodical 信息不广泛并且可以编码到分隔符单独的文本字段中(例如“PeriodicalName:Frequency:Publisher:UnitPrice”) ?

  3. 我可以说通过关联性 User--Periodical 关系是多对多的吗?

  4. 如果有人可以展示我如何对用户或订阅表施加约束(假设我不折叠订阅和期刊),我将不胜感激,s.t.当出于某种原因需要删除用户时,所有关联的订阅也将被删除。

  5. 想要将用户记录保留一段时间(比如一年),即使在所有订阅都已过期之后,所以我想我可以将 NULL 分配给用户表中的 FK subscription_id,对吗?这是订阅表中没有相应记录的情况。

最佳答案

  1. 是。

  2. 您描述的“非规范化”在极少数情况下可能有用,但它违反了关系设计。

  3. 是的。

  4. 这种类型的约束(一对一)在大多数 RDBMS 产品中并未以声明方式实现。相反,我们有 1 到 0 或 1。您可以使用触发器来完成,但这很棘手且微妙。 Google for Object-Role Modeling,这是一种更全面的建模技术,可以解决类似这样的问题(以及“非此即彼”和“至少 2 个”以及许多其他问题。)

  5. 这将是处理它的标准方法。您还可以为订阅留一个到期日期。但是 1 到 0 或 1 的不足很好地促进了你的建议。

关于mysql - 如何为这个和等效的 SQL 建模——用户、订阅、期刊,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8022128/

相关文章:

sql-server - 在 sql server 中使用动态模式名​​称时编写存储过程

java - Hibernate:如何使用 HQL 选择空对象?

c# - 使用sql参数转义SQL LIKE语句中的特殊字符

sql - 向sql中的列添加小写约束

mysql - 错误无法在组件 :Sonar Exception? 上保存公制 pdf 数据的度量

mysql - 使用 SELECT 时如何更改属性名称?

sql - jOOQ - 支持任意程度的 UPDATE ... SET ... 查询

MySQL 选择一段时间内的最大并发调用数

mysql选择动态行值作为列名,另一列作为值

MySQL:插入时触发器导致错误 1292(截断不正确的 DOUBLE 值)?