我正在开发一个房地产网站并需要制作通知邮件:当在网站上插入新房产时,在该特定国家和/或地区和/或城市和/或特定房产中订阅通知的人操作(出租,销售)将收到电子邮件通知。一个人可以订阅不同的地区,城市等,而不仅仅是一个。一个人每周只会收到一个通知,但是如果有新的属性,他会说。我正在考虑如何更好地为订阅者创建一个mysql表,以便轻松检索它们。表格如下:
create table subscribers(
user_email varchar(255),
area_id int(4));
是一个坏主意,因为如果会有100,000个(展望未来)订阅者并且每个订阅10个区域,那么表中将有1,000,000行。所以,我正在寻找有效的解决方案来完成这样的任务。
如果您有其他建议,我希望听到。
提前致谢!
答案 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)
答案 2 :(得分:0)
您的表格看起来是正确的,假设user_email
是识别您的用户的主键。如果是这样,请在subscribers
表格中添加PRIMARY KEY (user_email, area_id)
,以表明这两个字段一起构成您的主键。
您对重复电子邮件的担忧与架构设计无关,而与您打算运行的查询有关。当然,这在很大程度上取决于您的其他数据的存储方式,但可能看起来像:
SELECT DISTINCT user_email WHERE area_id IN (...)
(有关上周查看过商家信息的area_id
值列表。)
这是一个简单的查询,可以根据您的架构的其余部分进行优化和改进,但它说明了尽管多次列出同一个人,但避免生成多个电子邮件是多么容易。
答案 3 :(得分:0)
您可以制作电子邮件地址的额外表格。 因此,您只能在订阅者表中存储ID,而不是一次又一次地存储相同的电子邮件地址(尽管数据库中可能存在一些优化)。