帮助php / mysql邮件程序

时间:2010-06-04 21:58:26

标签: php mysql

我正在开发一个房地产网站并需要制作通知邮件:当在网站上插入新房产时,在该特定国家和/或地区和/或城市和/或特定房产中订阅通知的人操作(出租,销售)将收到电子邮件通知。一个人可以订阅不同的地区,城市等,而不仅仅是一个。一个人每周只会收到一个通知,但是如果有新的属性,他会说。我正在考虑如何更好地为订阅者创建一个mysql表,以便轻松检索它们。表格如下:

create table subscribers(
user_email varchar(255),
area_id int(4));

是一个坏主意,因为如果会有100,000个(展望未来)订阅者并且每个订阅10个区域,那么表中将有1,000,000行。所以,我正在寻找有效的解决方案来完成这样的任务。

如果您有其他建议,我希望听到。

提前致谢!

4 个答案:

答案 0 :(得分:1)

您应该使用交叉引用(多对多)表。这将使数据更加规范化:

CREATE TABLE `areas` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `name` varchar(255) NOT NULL
  PRIMARY KEY  (`id`)
)


CREATE TABLE `subscribers` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `email` varchar(255) NOT NULL
  PRIMARY KEY  (`id`)
)


-- cross ref table
CREATE TABLE `areas_subscribers` (
  `area_id` int(10) unsigned NOT NULL,
  `subscriber_id` int(10) unsigned NOT NULL,
  UNIQUE KEY (`area_id`,`subscriber_id`)
)

一百万行不是问题。特别是使用交叉参考表。

答案 1 :(得分:0)

  

表格中将有1,000,000行

那又怎样? mySQL can handle it

据我所知,你这样做的方式非常好。它很好地规范化了,我想不出更好的方法。

答案 2 :(得分:0)

您的表格看起来是正确的,假设user_email是识别您的用户的主键。如果是这样,请在subscribers表格中添加PRIMARY KEY (user_email, area_id),以表明这两个字段一起构成您的主键。

您对重复电子邮件的担忧与架构设计无关,而与您打算运行的查询有关。当然,这在很大程度上取决于您的其他数据的存储方式,但可能看起来像:

SELECT DISTINCT user_email WHERE area_id IN (...)

(有关上周查看过商家信息的area_id值列表。)

这是一个简单的查询,可以根据您的架构的其余部分进行优化和改进,但它说明了尽管多次列出同一个人,但避免生成多个电子邮件是多么容易。

答案 3 :(得分:0)

您可以制作电子邮件地址的额外表格。 因此,您只能在订阅者表中存储ID,而不是一次又一次地存储相同的电子邮件地址(尽管数据库中可能存在一些优化)。