邮件列表的数据库结构

时间:2012-02-16 07:19:45

标签: mysql

我正在为邮件列表设计数据库结构 我需要记录的数据是邮件收件人数据:

由于邮件收件人数据不是预定义的, 它会导致一个问题: 例如: 一些接收者有姓名,邮件地址,电话号码 而其他人有姓名,出生日期,邮件地址,性别等......

So my design is like this:
Table Receiver:
PK: ReceiverID
    AttributeID
    DataID

Table Attribute:
PK: AttributeID
    AttributeName

Table Data:
PK: DataID
    DataContent

A example of one receiver is:
Receiver: 1 1 1
Attribute: 1 mailAddress
Data:1 test@test.com

Receiver: 1 2 2
Attribute: 2 Name
Data:2 Tony

这会导致问题,因为我想检查数据字段的类型和长度,有什么更好的数据库设计?对于糟糕的描述感到抱歉,如果你感到困惑,我会澄清它。非常感谢。

1 个答案:

答案 0 :(得分:1)

每个定义不可能定义未知属性的数据类型。这就是数据库的工作方式。

我知道你希望生日是DATETIME专栏。 (以及其他一些属性可能还有其他“特殊”数据类型)

我无法相信预定义可用属性的不可靠性 - 它们是有限的。然后继续并定义可能的属性列表。

更好的数据库设计是创建一个包含所有可能字段的接收器表,并允许它们为NULL。在没有必要的情况下,将数据库用作任意属性的“通用存储”是不好的做法。

你的桌子看起来像这样:

CREATE TABLE maillist_receivers (
  id INT NOT NULL AUTO_INCREMENT, 
  PRIMARY KEY(id),
  email VARCHAR(128) NOT NULL, 
  firstname VARCHAR(128), 
  lastname VARCHAR(128), 
  phone VARCHAR(128), 
  birthdate DATETIME, 
  ...
)

您的数据可能如下所示:

id     firstname      lastname     email            phone      birthdate
1      Max            Power        mp@foo.com       NULL       21.12.2012
2      John           Doe          john@doe.com     555-1234   NULL
  • 表现更好
  • 数据类型定义明确
  • 如果值为NULL,您可以检入应用程序代码并相应地处理。 (如:不发送生日卡,..)
  • 很干净 - 您可以在数据库浏览器中读取明文数据