1

请看下面的分析,让我知道两者中最好的数据库设计(InnoDB)。要求 - 当存在许多并发数据库连接时,用户无需等待更快的写入和读取,预计这些连接将呈指数级增长。如果用户必须等待,则磁盘空间优势无关紧要。

假设 – 单 CPU(仅用于比较)

方法 1 (M1) Table1 UserProfile -> UserID, City, State, Country

Method2 (M2)(Normalized) Table2a UserProfile->UserID,LocationsID Table2b Locations-> LocationsID, City, State, Country

写(顺序不按顺序)

一个。写入表

M1-直接写入= t1 M2-(搜索Table2b以查看记录是否存在=t2+如果没有匹配则插入=t1将UserID和LocationsID写入表2a=t3) (t1+t2+t3) > t1

b.CPU 中断

M1=1,M2=2

c.磁盘I/O

M1=1,M2=2

d.行锁和释放

M1=1,M2=2

e. 磁盘空间

M1=More, M2=Less(只有M2有优势)

读取(假设记录不在缓存中)

一个。从表中读取

M1-直读=t4,M2-Join-t5 t5>t4

湾。CPU 中断

M1=1, M2=2

c.磁盘I/O

M1=1,M2=2

我相信,如果预先填充了 Table2b 或者如果国家、州、城市下拉列表被数字标记,则可以改善在 Method2 中花费的时间。即使你负载均衡 M1 似乎是一个有吸引力的设计。增加 BW 可能会使情况恶化,因为会有更多的并发数据库连接。让我知道你的想法

4

1 回答 1

1

Method2 (M2)(Normalized) Table2a UserProfile->UserID,LocationsID Table2b Locations-> LocationsID, City, State, Country

您已将城市、州和国家/地区替换为 ID 号。虽然在某些情况下这可能是一个好的设计决策,但它并不总是一个好的设计决策。它与规范化无关。(没有“我使用了身份证号”这样的正常形式。)

当有国际标准时,使用它通常是有意义的。参见ISO 3166-1。三字母代码可能更有意义。

-- Untested code.
create table countries (
  iso_country_code char(2) not null,
  country_name varchar(35) not null,
  primary key (iso_country_code),
  unique (country_name)
);

create table states (
  state_code char(2) not null,          -- application-dependent, consider ISO 3166-2
  state_abbrev varchar(7) not null,
  state_name varchar(35) not null,
  iso_country_code char(2) not null,
  primary key (state_code, iso_country_code),
  unique (state_abbrev, iso_country_code),
  unique (state_name, iso_country_code),
  foreign key (iso_country_code) references countries (iso_country_code)
);

create table cities (
  city_name varchar(35) not null,
  state_code char(2) not null,
  iso_country_code char(2) not null,
  primary key (city_name, state_code, iso_country_code),
  foreign key (state_code, iso_country_code) 
    references states (state_code, iso_country_code)
);

create table UserProfile (
  UserID integer not null,
  city_name varchar(35) not null,
  state_code char(2) not null,
  iso_country_code char(2) not null,
  primary key (UserID),
  foreign key (city_name, state_code, iso_country_code) 
    references cities (city_name, state_code, iso_country_code)
);

国家、州和城市的单独表使使用 SELECT 语句填充组合框变得容易。他们不需要数字“标签”。这三个表都是关键;它们没有非主要属性。我认为他们在 5NF 中。

根据经验,不要搜索一行来查看它是否存在,如果不存在则插入。这需要两次往返数据库。

相反,只需插入该行,并捕获重复的错误。无论如何,您必须捕获错误——除了重复之外,还有很多事情可以阻止插入成功。

于 2013-05-13T23:00:50.643 回答