Sql 在联系人数据库中,我在哪里存储邮件的标签信息

Sql 在联系人数据库中,我在哪里存储邮件的标签信息,sql,database-design,data-modeling,Sql,Database Design,Data Modeling,我正在尝试为邮件建立一个联系人数据库,我正在尝试完全自动化标签,但不知道如何实现 我将在数据库中的何处存储出现在邮件标签顶部的名称: 乔·汤姆森先生和夫人 詹姆斯·贝瑞博士和夫人 施瓦茨家族 这似乎必须是一个基于许多不同数据段的计算字段 关于如何建立邮件数据库并直接为标签生成名称,您有什么建议吗?在此基础上,我将更新联系人表,包括: 称呼(先生、夫人、博士等) 我决定使用“汤普森一家”与乔·汤普森先生和特里·汤普森夫人以及乔和比利的对比,根据相同地址、相同姓氏的个人联系人数量=2+ 参考

我正在尝试为邮件建立一个联系人数据库,我正在尝试完全自动化标签,但不知道如何实现

我将在数据库中的何处存储出现在邮件标签顶部的名称:

  • 乔·汤姆森先生和夫人
  • 詹姆斯·贝瑞博士和夫人
  • 施瓦茨家族
这似乎必须是一个基于许多不同数据段的计算字段

关于如何建立邮件数据库并直接为标签生成名称,您有什么建议吗?

在此基础上,我将更新
联系人表,包括:

  • 称呼(先生、夫人、博士等)
我决定使用“汤普森一家”与乔·汤普森先生和特里·汤普森夫人以及乔和比利的对比,根据相同地址、相同姓氏的个人联系人数量=2+

参考资料:


我个人不喜欢在数据库列定义中对此类有效值进行编码。你的管理开销会很大。在一个不同的表中管理这些值更好,但是在另一个表中使用外键来读取标签对我来说似乎不太合适。上次我需要做类似的事情时,我为标签添加了一列作为简单的varchar列

但是如何避免重复和非常相似的标签(例如“Mr”和“Mr”)?我在列上添加了一个索引,并在前端添加了一个AJAX查询,以列出所有可用的不同标签,并执行自动完成。这真的很棒,因为

  • 用户不必在可能值的长列表中滚动
  • 你不需要自己管理这些价值观

这样,您可以允许任何标签,包括“先生和夫人”或“博士教授”

根据您的说明,我将创建一个附加表

我假设您有一个“联系人”表,其中包含不同的人员列表。 您还可以有一个“家庭”表,其中包含姓氏或家庭的列表。我会把地址放在这张桌子上。 然后,每个联系人都会有一个字段将他们链接到一个家庭(即使每个家庭只有一个人) 每个联系人还将有一个包含1/0值的“主要联系人”字段

然后,您可以有如下查询逻辑:

if count(*) of contacts per household = 1 then
  label = contact.title & contact.nameinfo
if count(*) of contact per household = 2 and both of those contacts are primary contacts then
  label = primarycontact.title & name  plus primarycontact2.title & name
else
 label = household.lastname & "family"

您可能希望利用逻辑来完善它,但真正的关键是拥有一个带有单独地址的家庭表和一个与该地址内的人的联系表。

一个相当规范化的设计看起来像:

Location(addr_id,primary_contact_id, street_addr, city, post_code, country)
Contact(contact_id,first_name, last_name, title);
LivesAt(contact_id,addr_id)
MarriedTo(contact_id_1,contact_id_2)
ChildOf(parent_id,child_id)
这些基本上就是你的桌子。然后可以创建视图:

1.家庭。假设一个家庭至少有一位父母和一个孩子住在同一个地址,并且他们有相同的姓氏(如果父母和孩子有不同的姓氏,你将用他们的全名给他们写信)

按您认为合适的格式设置

2.没有孩子的已婚夫妇

    CREATE VIEW Couple AS 
    SELECT * FROM
    (SELECT C.contact_id, C.last_name, C.title FROM Contact AS C 
    INNER JOIN MarriedTo AS M
    ON (M.contact_id_1=C.contact_id)
    INNER JOIN
    SELECT D.contact_id, D.last_name, D.title FROM Contact as D
    ON (M.contact_id_2=D.contact_id)
    INNER JOIN Location AS L
    ON
    L.addr_id NOT IN Family
    AND (L.primary_contact_id = M.contact_id_1) 
    OR (L.primary_contact_id = M.contact_id_2)

等等。

你不能只是连接联系人,因为如果你有一个完整的家庭。。。你将如何确定“汤普森一家”出现在邮寄标签上。为了澄清,你将如何确定“汤普森一家”与乔·汤普森先生、特里·汤普森夫人、乔和比利的对比
    CREATE VIEW Couple AS 
    SELECT * FROM
    (SELECT C.contact_id, C.last_name, C.title FROM Contact AS C 
    INNER JOIN MarriedTo AS M
    ON (M.contact_id_1=C.contact_id)
    INNER JOIN
    SELECT D.contact_id, D.last_name, D.title FROM Contact as D
    ON (M.contact_id_2=D.contact_id)
    INNER JOIN Location AS L
    ON
    L.addr_id NOT IN Family
    AND (L.primary_contact_id = M.contact_id_1) 
    OR (L.primary_contact_id = M.contact_id_2)