需要帮助设计包含要存储的 ID 列表的表

1 database-design

我需要创建一个表来保存保存的电子邮件以供将来发送(收件人、发件人、消息、预定发送日期等)。

这里的问题是,直到发送当天我才知道谁应该收到电子邮件。

我的意思是,创建电子邮件是为了发送给某些选定的组织,但该组织的“成员”将不断加入和离开,因此,如果有人创建下个月要发送的电子邮件,则要发送的成员电子邮件地址列表到那时就会有所不同。

所以,我需要在表中保存的是电子邮件应该发送到的组织列表,以便我在实际发送电子邮件时可以查询最新的成员电子邮件地址列表。希望这是有道理的。

无论如何,我的问题是:什么被认为是“正确的设计”?

我最初的想法是只保存以逗号分隔的组织 ID 列表。

我知道我永远不必搜索列表中的组织,所以我不在乎它是否不可查询,而且我知道我可以将其标准化为每个接收组织一行,但这似乎是不必要的重复无目的的数据,特别是因为我只查询发件人而不是收件人。

那么,ID 列表只是一件可怕的、没有好处的、只有新手才会想到的坏事吗?或者说在某些情况下可以使用吗?或者还有其他我不知道的方法可以做到这一点?我确信我不是唯一一个遇到过这种情况的人!

Nei*_*gan 5

不要使用 id 列表。你会后悔的。使用联结表。

数据定义语言:

create table organization (
  organization_id bigserial primary key,
  name text not null
);

create table individual (
  individual_id bigserial primary key,
  email_address varchar(255) not null
);

create table organization_member (
  organization_id bigint references organization(organization_id),
  individual_id bigint references individual(individual_id),

  primary key (organization_id, individual_id)
);

create table email_message (
  email_message_id bigserial primary key,
  send_at datetime not null,
  subject varchar(80),
  body text
);

create table email_message_organization (
  email_message_id bigint references email_message(email_message_id),
  organization_id bigint references organization(organization_id),

  primary key (email_message_id, organization_id)
);
Run Code Online (Sandbox Code Playgroud)

数据标记语言:

-- add an org:

insert into organization (name) values ('Acme, Inc');

-- add an individual:

insert into individual (email_address) values ('user@example.com');

-- associate individual w org:

insert into organization_member values (1,1);

-- add an email message:

insert into email_message (send_at, subject) values ('2013-07-31 12:12:12', 'test');

-- associate an email message with an org:

insert into email_message_organization values (1, 1);

-- when it's time to send the email, get the right people:

select 
e.subject, 
e.body, 
i.email_address 
from individual i 
join organization_member om using (individual_id) 
join email_message_organization emo using (organization_id) 
join email_message e using (email_message_id);

-- send the emails, record that they were sent in another table
Run Code Online (Sandbox Code Playgroud)

你应该使用 Party 模型来代表个人和组织,这不是我使用的,但你仍然应该查一下。