MySQL数据库模式:3列相同类型,目的不同

时间:2017-07-12 21:53:29

标签: mysql

我正在构建一个财务应用,它需要以下表格:

  1. 项目,可以有一个税
  2. 发票,可以有多个项目
  3. 问题:

    发票必须能够包含3类电子邮件:

    1. 收件人电子邮件
    2. CC电子邮件
    3. BCC电子邮件
    4. 到目前为止,我只有一个收件人/ cc / bcc专栏,但我不认为它很好,因为我基本上必须将电子邮件连接在一起并用逗号分隔它们或一些东西。

      我还想过一个通用的电子邮件表,但是我必须分别创建invoice_recipient_emailinvoice_cc_emailinvoice_bcc_email表,以便将电子邮件链接回来特定的发票ID以及3种类型的分类。

      有人可以就我的第二个解决方案向我提出建议,还是提供更好的方法来做到这一点?

      这是我目前的架构:

      CREATE TABLE tax (
          id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
      
          name VARCHAR(255) NOT NULL,
          rate INT(3) NOT NULL,
      
          PRIMARY KEY (id)
      );
      
      CREATE TABLE item (
          id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
      
          name VARCHAR(255) NOT NULL,
          description VARCHAR(1000) NOT NULL,
          quantity INT(10) NOT NULL,
          price INT(10) NOT NULL,
      
          CONSTRAINT `f_tax_item_tax_id` FOREIGN KEY (`tax_id`) REFERENCES `tax` (`id`),
      
          PRIMARY KEY (id)
      );
      
      CREATE TABLE invoice (
          id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
      
          invoice_number VARCHAR(255) NOT NULL,
          recipients VARCHAR(1000) NOT NULL,
          cc VARCHAR(1000) NOT NULL,
          bcc VARCHAR(1000) NOT NULL,
          discount INT(10) NOT NULL,
          note VARCHAR(500) NOT NULL,
          terms VARCHAR(2000) NOT NULL,
          due_date TIMESTAMP NOT NULL,
      
          PRIMARY KEY (id)
      );
      

2 个答案:

答案 0 :(得分:1)

我会添加一个带有id (pk), invoice_id (fk), email, recipient_type字段的收件人表,其中收件人类型可以具有以下值之一:to,cc或bcc。收件人类型字段将告诉您如何使用电子邮件地址,因此您不需要3个单独的表来容纳3种不同的收件人类型。

1条记录只能容纳1个电子邮件地址。

答案 1 :(得分:1)

您可以将电子邮件规范化为单个表格,并在其上放置一个标记以对其类型进行分类。

CREATE TABLE invoice (
    id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    invoice_number VARCHAR(255) NOT NULL,
    discount INT(10) NOT NULL,
    note VARCHAR(500) NOT NULL,
    terms VARCHAR(2000) NOT NULL,
    due_date TIMESTAMP NOT NULL,
    PRIMARY KEY (id)
);


CREATE TABLE email(
    id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    invoice_id INT(10)  not null references invoice(id),
    email_type int not null,
    addresses varchar(1000),
    PRIMARY KEY (id)
);

您也可以在另一个表格中定义您的电子邮件类型。您可以看一下在生产环境中为MSSSQL中的电话号码实现的这种方法,但概念相同。然而,我们将记录标准化为每条记录的一个电话号码,我建议你这样做。

CREATE TABLE [dbo].[ActorPhones](
    [PKId] [int] IDENTITY(0,1) NOT NULL Primary Key,
    [FKActorId] [int] NOT NULL References Actor(PKID),
    [FKPhoneTypeId] [int] NOT NULL,
    [Number] [varchar](20) NOT NULL
) ON [PRIMARY]

CREATE TABLE [dbo].[PhoneTypes](
    [PKId] [int] IDENTITY(0,1) NOT NULL Primary Key,
    [PhoneTypeName] [varchar](50) NOT NULL References ActorPhones(PKId),
    [PhoneTypeDescription] [varchar](250) NULL,
    [ModifiedDate] [datetime] NULL,
    [ModifiedBy] [varchar](50) NULL
)