我在哪里将标签信息存储在联系人数据库中以进行邮件发送

时间:2009-10-18 10:54:15

标签: sql database-design data-modeling

我正在尝试为邮件设置联系人数据库,我正在尝试完全自动化标签,但无法弄清楚如何。

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

  • mr&约翰·汤姆森夫人
  • 博士。和詹姆斯·萨姆斯夫人
  • Schwartz家庭

这似乎必须是基于许多不同数据的计算字段。

有关如何拥有邮件数据库并直接为标签生成名称的任何建议吗?

4 个答案:

答案 0 :(得分:5)

建立the data model I suggested in your previous question,我将更新CONTACTS表格以包含:

  • SALUTATION(先生,夫人,博士等)

我决定使用“Thompson Family”与Joe Thompson先生和Terry Thompson夫人以及Joe和Billy先生根据同一地址的个人联系人数= 2+,使用相同的姓氏。

参考文献:

答案 1 :(得分:1)

相当标准化的设计看起来像:

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.Family。假设一个家庭至少有一个父母和一个孩子住在同一个地址,并且他们共享相同的姓氏(如果父母和孩子有不同的姓氏,您将通过他们的全名给他们写信)。

    CREATE VIEW Family AS 
    SELECT UNIQUE last_name, addr_id, street_addr, city, post_code, country FROM
    (SELECT p1.contact_id, p1.first_name, p1.last_name FROM Contact AS p1)
    INNER JOIN  
    (SELECT p2.contact_id, p2.first_name, p2.last_name FROM Contact AS p2)
    ON (p2.last_name = p1.last_name AND p2.contact_id IN ChildOf 
    AND p1.contact_id IN ChildOf)
    INNER JOIN 
    Location AS l 
    ON (p1.contact_id = l.primary_contact_id) 
    OR (p2.contact_id = l.primary_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)

等等。

答案 2 :(得分:0)

我个人不喜欢在数据库列定义中编码这些有效值。您的管理开销很大。在一个不同的表中管理这些值是更好的,但是将一个外键放到另一个表中,你阅读标签对我来说似乎不对。上次我需要做类似的事情时,我将标签的列添加为一个简单的varchar列。

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

  • 用户不必强制滚动查看可能值的长列表
  • 您不需要自己管理这些值

这样你就可以允许任何标签,包括“先生和夫人”。或“Dr。Dr. Prof。”。

答案 3 :(得分:0)

鉴于你的澄清 - 我会创建一个额外的表。

我假设你有一个“联系人”表,其中包含一个不同的人员列表。 您还可以拥有一个“家庭”表,其中包含姓氏或家庭列表。我会把地址放在这个表中。 然后,每个联系人都会有一个将他们与家庭联系起来的字段(即使每个家庭只有一个人)。 每个联系人还将有一个“主要联系人”字段,其中包含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"

你会想要使用逻辑来完善它,但真正的关键是拥有一个带有单独地址的家庭桌子以及与该地址内的人员的联系表。