2013-06-18 118 views
0

检查表的这一形象 - http://puu.sh/3ipDq.pngMySQL数据库结构(架构)咨询

我怎样才能在MySQL(SQL)的模式呢?我希望能够以规范化的方式在我的数据库表中存储包含在此表中的数据。我应该能够轻松地查询数据库并在网页上形成这个精确的表格(使用HTML)。

数据应该存储得足够好,以便能够对这些数据集进行一些计算(聚合函数),过滤器,比较,搜索等(假设一段时间后我们将获得大量数据,那么基本上查询应该是高性能的)。

如果是有道理的,一些帮助,将不胜感激。我试着用一些key/val结构来模拟这些数据,但没有成功。很难保持行/列之间的关系。例如,第二列中的第一行与第三,第四,第n列中的第一行相关。

另一种解决方案是使与尽可能多列的表所示在图像中。但问题在于,这只是一个示例表。将会有更多的表格,像这些变量列,完整的不相关的列名/类型,值等。例如,这里有另一个表 - http://puu.sh/3iq0g.png - 我希望能够存储来自两个表的数据(当然还有更多相关的和不相关的表)以“通用”的方式。首先想到的是key/val方法,但我失败了。

如果我也许可以考虑使用这部分的一些NoSQL的解决方案?

回答

2

这并不复杂。

你需要几个表,但:

Cab_type  PK cabtype  details... 
Media_option PK mediatype details... 
Placement  PK placement details... 
Unit   PK unit  details... 
pricing  PK (serial number) FK cabtype FK mediatype FK placement FK unit Price 

我相信这会适合正常形式的数据库的所有定义,并具有可不费吹灰之力的优势来查询得到你需要的任何表可以是信息通过定价表链接。

希望这会有所帮助。

可见你的第二个表,您的设想ñ表,这就是正常的形式进入自己。在某些时候,你必须编写关系。如果单位总是与某个目的的位置相关联,那么可以创建一个表unit_placement,其中包含每个表中的FK来描述关系。你最终必须输入一些将各种东西连接起来的数据。它,因为你的数据不按字母顺序排序不会自动(经常!)发生

0

,你需要包括让你控制的排序顺序表。您需要一个控制出租车的排序顺序。

create table cab_sort_order (
    cab_type varchar(35) not null, 
    cab_type_sort_order integer not null, 
    primary key (cab_type) 
); 

insert into cab_sort_order values 
('Toyota Etios', 1), 
('Maruti Suzuki - SX4', 2), 
('Airport Media', 3), 
('Cab Meter Receipts', 4); 

另一个控制媒体选项的排序顺序。

create table media_option_sort_order (
    media_option varchar(35) not null, 
    media_option_sort_order integer not null, 
    primary key (media_option) 
); 

insert into media_option_sort_order values 
('Cab Exterior', 1), 
('Sampling', 2), 
('Leaflets/Flat & Sun Visor Cover', 3), 
('Seat Flap & Sun Visor Cover', 4), 
('Rooftop Carrier', 5), 
('Raoad Show - 10 Cabs', 6), 
('Boarding Pass', 1); 

这两个表都在5NF。

cab_media_options的结构是简单的。

create table cab_media_options (
    cab_type varchar(35) not null, 
    media_option varchar(35) not null, 
    placement varchar(35) null, 
    price integer not null, 
    unit varchar(35) not null, 
    primary key (cab_type, media_option), 
    foreign key (cab_type) references cab_sort_order (cab_type), 
    foreign key (media_option) references media_option_sort_order (media_option) 
); 

insert into cab_media_options values 
('Toyota Etios', 'Cab exterior', '4 doors + boot', 11000, 'Cab/Month'), 
('Toyota Etios', 'Sampling', NULL, 2500, 'Cab/Month'), 
('Toyota Etios', 'Leaflets/Flat & Sun Visor Cover', NULL, 2000, 'Cab/Month'), 
('Maruti Suzuki - SX4', 'Cab exterior', '4 doors + boot', 12000, 'Cab/Month'), 
('Maruti Suzuki - SX4', 'Sampling', NULL, 3000, 'Cab/Month'), 
('Airport Media', 'Boarding Pass', 'Back Side of Pass', 600000, 'Month/All Cabs'); 

我不知道你所有的列是什么意思,但那张表也可能是5NF。

要获取需要匹配链接图像的数据,请将cab_media_options连接到控制排序顺序的两个表。

select cmo.*, cs.cab_type_sort_order, ms.media_option_sort_order 
from cab_media_options cmo 
inner join cab_sort_order cs 
     on cmo.cab_type = cs.cab_type 
inner join media_option_sort_order ms 
on cmo.media_option = ms.media_option 
order by cs.cab_type_sort_order, ms.media_option_sort_order 

您可以使用附加表提高数据完整性。例如,您可以创建一个包含单列的驾驶室类型表。

Table: cab_types 
cab_type 
-- 
Toyota Etios 
Maruti Suzuki - SX4 
Airport Media 
Cab Meter Receipts 

然后设置在cab_sort_order一个外键引用cab_types,以及(可能)替换cab_media_options有一个外键引用cab_types外键。

以这种方式提高数据完整性与规范化无关。 (许多设计决定与标准化无关。)