首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL数据库模式:3列类型相同,用途不同

MySQL数据库模式:3列类型相同,用途不同
EN

Stack Overflow用户
提问于 2017-07-12 21:53:28
回答 2查看 62关注 0票数 2

我正在构建一个金融应用程序,它需要以下表格:

  1. 税费
  2. 项目,可征收一项税款
  3. 发票,它可以有许多项目

问题的

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

  1. 收件人电子邮件
  2. CC电子邮件
  3. BCC电子邮件

到目前为止,我只有一个收件人/cc/bcc专栏,但我不认为这是好的,因为我基本上需要连接在一起的电子邮件,并将他们用逗号或其他什么。

我还考虑了一个通用电子邮件表,但接下来我必须分别创建invoice_recipient_emailinvoice_cc_emailinvoice_bcc_email表,以便将电子邮件链接回特定的发票ID,并按3种类型对它们进行分类。

有人能在我的第二个解决方案上给我建议吗,或者提供一个更好的解决方法?

下面是我当前的模式:

代码语言:javascript
复制
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)
);
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-12 22:04:51

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

1条记录将只保存一个电子邮件地址。

票数 2
EN

Stack Overflow用户

发布于 2017-07-12 22:06:13

您可以将您的电子邮件标准化到一个表中,并在其上放置一个标志来对其类型进行分类。

代码语言:javascript
复制
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中的电话号码实现的这种方法,但概念相同。然而,我们将记录标准化为每个记录的一个电话号码,我也建议您这样做。

代码语言:javascript
复制
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
) 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45068116

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档