0

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

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

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

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

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

我是否应该考虑为此部分使用一些 NoSQL 解决方案?

4

2 回答 2

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 始终与放置相关联,您可以创建一个表 unit_placement ,其中包括每个表中的 FK 以描述关系。您最终必须输入一些将事物联系在一起的数据。它不会自动发生(经常发生!)

于 2013-06-18T10:07:10.967 回答
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 的外键。

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

于 2013-06-18T11:57:58.640 回答