Php 规范化社交网络类型网站的表

Php 规范化社交网络类型网站的表,php,mysql,sql,database,database-normalization,Php,Mysql,Sql,Database,Database Normalization,我试图建立一个网站,它将收获用户的信息,并存储到一个表中。让我们将表格命名为用户详细信息。它将包含以下列: id、国家、城市、姓名、姓氏、生日、性别、电子邮件、密码、电话号码、搜索电话号码 id=1,2,3,4。。INT自动递增非空无符号主键 phone_number=其唯一但仅在同一国家/地区。也许一个来自英国的人会和一个来自西班牙的人有相同的电话号码,但不在英国。换句话说,它与国家有关。为使其唯一,搜索电话号码将由国家/地区+电话号码组成,例如:SPAIN394221234 用户将使用其唯一

我试图建立一个网站,它将收获用户的信息,并存储到一个表中。让我们将表格命名为用户详细信息。它将包含以下列:

id、国家、城市、姓名、姓氏、生日、性别、电子邮件、密码、电话号码、搜索电话号码

id=1,2,3,4。。INT自动递增非空无符号主键 phone_number=其唯一但仅在同一国家/地区。也许一个来自英国的人会和一个来自西班牙的人有相同的电话号码,但不在英国。换句话说,它与国家有关。为使其唯一,搜索电话号码将由国家/地区+电话号码组成,例如:SPAIN394221234

用户将使用其唯一的搜索电话号码搜索其他用户

是否需要尝试并规范化此表

同样在同一个网站上,我建立了一个简单的PM系统和一个图库(显示用户上传的图片)。所以我有两张桌子: 1) 消息表(发送者、接收者、消息等) 2) 照片表格(目录、文件名等)

同样,是否需要规范化消息和照片表

我有点困惑,因为在某些情况下规范化是必须的,但在另一些情况下则不是


提前谢谢

1-创建一个新的国家/地区表,如

create table country (id int auto_incremenet primary key, country varchar(100));
create city (id int auto_increment primary key , city varchar(100), fk_country_id int);
2-创建一个新的城市表,如

create table country (id int auto_incremenet primary key, country varchar(100));
create city (id int auto_increment primary key , city varchar(100), fk_country_id int);
fk_country_id将具有该城市所在国家的id

3-在上面提到的表中,删除国家/地区和城市列,只添加fk_city_id列。fk_city_id将具有此人所在城市的id

4-为手机创建表格,如

create table user_phones(id int auto_increment primary key, fk_country_id int, phone_number varchar(15)) ;
5-向该表添加唯一索引,如下所示

CREATE UNIQUE INDEX idx_country_phone ON user_phones(fk_country_id, phone_number);
从表中删除电话号码和搜索电话号码,并将fk\U user\U phones\U id列添加到表中。。它将具有用户表中相关行的id值


6-当用户进行搜索时,按国家id和电话号码进行过滤

,因此,如果有人插入了一个不是他们的真实号码,那么真正的所有者就不能插入它了?那么两个以上的用户共享一个电话号码呢。“哎呀”。。。DB表应该始终规范化,除非您有一个压倒性的性能问题,不能选择加入查询。否。它将搜索现有的表,并查看该数字是否已注册。如果是,它将不接受。老实说,我正在考虑如何处理这件事。我关心的是数据库结构。我需要从一开始就设计好一些东西。有些人说,有时候最好不要规范化数据库。我引用“如果您曾经尝试过五表联接,您知道它在原则上是有效的,但在实践中非常缓慢。”。假设我没有使用您建议的规范化(我将实现该规范化以了解其工作原理),那么与我描述的表相比,它有哪些缺点(包含用户所有详细信息的表格)?搜索电话号码字段太大时会导致性能问题。因为假设您将有数十万或数百万来自西班牙的电话号码以西班牙开头…即使是索引数据库也无法有效使用索引,因为它必须扫描从西班牙开始的所有行,直到找到第一个NUBer匹配。您的列值应从一开始就应尽可能不同,因此避免在列数据中使用相同的前缀当我处理数百万行选民数据时,我们有一个以选民选区为前缀的列(某些选区有数百万选民)。我跟踪到了该前缀的问题。省得你自己头疼。此外,始终在联接/可搜索列上开始规范化和正确索引,并且只有在以后出现性能问题时才进行反规范化。数据库设计用于执行重集操作(联接等)高效。不要害怕使用它们!如果重复值是一个永远不会用作搜索字段(例如生日)的值,我是否也需要将其删除到单独的表中?不,在这种情况下不需要