Mysql DB结构(架构)建议

时间:2013-06-18 09:54:03

标签: php mysql sql database data-structures

检查表格的这张图片 - http://puu.sh/3ipDq.png

我如何在MySQL(sql)中对此进行建模?我希望能够以规范化的方式在数据库表中存储此表中包含的数据。我应该能够轻松地查询数据库并在网页上形成这个确切的表格(使用HTML)。

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

如果这是有道理的,一些帮助将不胜感激。我已经尝试使用一些键/ val结构建模这些数据,但没有成功。很难保持行/列之间的关系。例如,第二列中的第一行与第3,第4,第n列中的第一行相关。

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

我是否可以考虑在这部分使用NoSQL解决方案?

2 个答案:

答案 0 :(得分: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

我相信这将适合普通表单数据库的所有定义,并且具有搜索所需信息的轻松优势,因为任何表都可以通过定价表链接。

希望这有帮助。

访问您的第二张桌子和您设想的n个表格,这是普通表格自成一体的地方。在某些时候,您必须对关系进行编码。例如,如果单元始终与放置相关联,则可以创建一个表unit_placement,其中包含每个表中的FK以描述关系。您最终必须输入一些将事物链接在一起的数据。它不会自动发生(经常!)

答案 1 :(得分: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

您可以使用其他表增加数据完整性。例如,您可以创建一个包含单列的cab类型表。

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

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

以这种方式增加数据完整性与规范化无关。 (许多设计决策与规范化无关。)

相关问题