检查表格的这张图片 - http://puu.sh/3ipDq.png
我如何在MySQL(sql)中对此进行建模?我希望能够以规范化的方式在数据库表中存储此表中包含的数据。我应该能够轻松地查询数据库并在网页上形成这个确切的表格(使用HTML)。
数据应该存储得足够好,以便能够对这些数据集进行一些计算(聚合函数),过滤,比较,搜索等(假设在一段时间后我们将有大量数据,所以基本上查询应该是高效的。)
如果这是有道理的,一些帮助将不胜感激。我已经尝试使用一些键/ val结构建模这些数据,但没有成功。很难保持行/列之间的关系。例如,第二列中的第一行与第3,第4,第n列中的第一行相关。
另一种解决方案是创建一个包含图像所示列数的表。但这里的问题是,这只是一个示例表。将会有更多这样的表,包括变量列,完整的不相关的列名称/类型,值等。例如,这是另一个表 - http://puu.sh/3iq0g.png - 我希望能够存储来自两个表的数据(和以“通用”的方式表示许多更相关和不相关的表格。首先想到的是key / val方法,但我失败了。
我是否可以考虑在这部分使用NoSQL解决方案?
答案 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中的外键。
以这种方式增加数据完整性与规范化无关。 (许多设计决策与规范化无关。)