良好的数据库形式意见

时间:2014-06-13 19:11:56

标签: sql sql-server database normalization

好的我正在建立一个电子邮件应用程序,只有当他们满足某些要求(例如年龄,位置或爱好)时才允许您给人们发送电子邮件。

我无法弄清楚这两个字段的位置,以便我的数据库正确规范化(mail_pref_min_age | mail_pref_max_age)。

我想将它们放在配置文件表中,但我得到很多空值,因为人们不总是指定允许通过电子邮件发送的最小和最大年龄,这是应用程序的一个选项。我觉得没有规范化,任何人都有第二意见或更好的方法来做到这一点。我是否可以在一列中有一堆空值。

先谢谢。

参见示例

个人资料表

User id | username | mail_pref_min_age | mail_pref_max_age
1       | joe      |   25              | 50
2       | matt     | null              | null (this feels unnormalized to me)
3       | jake     | null              | null (this feels unnormalized to me)

个人资料表

settingsID | userID | mailsettingID
1          | 1      | 1
2          | 1      | 2

邮件表

mailID | mailsetting
1      | must live in USA
2      | must live in Canada

2 个答案:

答案 0 :(得分:1)

有两种可能的方法可以实现:您可以使用空值来表示没有上限/下限,或者(如注释中指示的@mlt)您可以使用“极端”非空值来设置边框 - - 例如0表示最小年龄,以及最大年龄(例如,如果这是一个tinyint值,则最大年龄可以设置为255)。

一些优点和缺点:

  • 如何显示最小/最大值?显示0和255看起来很愚蠢,你需要在UI中使用特殊处理代码将(比方说)255转换为“无限制” - 与你需要使用空值相同。
  • 使用空值,您必须在所有检查中包含trinay逻辑(true,false,null)
  • 使用“极值”,跳过trinay逻辑(年龄介于最小值和最大值之间,不需要空值检查)
  • 大多数人使用空值,因为它被认为更容易,或“有什么空值”。从长远来看,这可能是一个错误。

最终,如果你能够采用极端值,那么你就可以避免Nulls所造成的所有努力和痛苦。

答案 1 :(得分:0)

正式地,与任何可空字段的关系甚至不能转到1NF。此外,使用空值会使您的逻辑变得更加复杂。要解决此问题,您可以使用默认值或将mail_pref_min_agemail_pref_max_age提取到单独的表中。