有人可以告诉我,如何设计可以存储的数据库
谢谢!
修改
例如,我必须保存芝加哥和纽约之间的地方。 我不知道如何设计一个可以保持的数据库
答案 0 :(得分:2)
我有三张桌子:位置,路线和停靠点
locations:
location_id | name
routes:
route_id | description
stops:
stop_id | location_id (fk) | route_id (fk) | stop_number
停止表是交联表。在插入位置时,让应用程序设置正确的停止编号。 然后,您可以通过简单的
获取路线select * from routes join stops join location
where route_id = ...
order by stop_number
如果您需要在路线中插入位置,请使用两个查询:
update stops set stop_number = stop_number + 1
where route_id = ...
and stop_number > 'inserted_stop_number';
insert into stops (route_id, location_id, stop_number) values // etc
理论上,链接列表(存储对路径下一站的引用)在概念上更接近现实,但在标准的Mysql选项中,非常很难获得列表从这种方式存储的数据,所以我会建议反对它,并为自己保持简单。
如果你真的需要更多的权力来创建和使用路由中的链接节点,你可以考虑学习:http://openquery.com/graph/doc但是对于简单的从头到尾的路线不需要一直重新计算,上述内容很可能就足够了。
答案 1 :(得分:1)
您应该有另一个可以引用的表,它与所有开始,传输和完成记录具有一对多的关系,因此您可以将整个“集合”记录“绑定”在一起。 / p>
trip_id | ...
location_id | trip_id | location_type | location
在location_type
列中,您可以使用一些独特的标记来告诉您位置记录是否表示开始,运输或完成。例如,start可能是0
的标志,1
可能是过境的标志,而2
可能是结束的标志。
答案 2 :(得分:1)
未测试
CREATE TABLE Location (
ID INT UNSIGNED AUTO_INCREMENT,
Name VARCHAR(50),
PRIMARY KEY (ID)
) ENGINE=INNODB CHARACTER SET utf8
CREATE TABLE Trip (
ID INT UNSIGNED AUTO_INCREMENT,
Name VARCHAR(50),
StartLocation INT UNSIGNED,
EndLocation INT UNSIGNED,
PRIMARY KEY (ID),
CONSTRAINT Constr_Trip_StartLocation_fk
FOREIGN KEY Trip_StartLocation_fk (StartLocation)
REFERENCES Location (ID),
CONSTRAINT Constr_Trip_EndLocation_fk
FOREIGN KEY Trip_EndLocation_fk (EndLocation)
REFERENCES Location (ID)
) ENGINE=INNODB CHARACTER SET utf8
CREATE TABLE TripStopoff (
Trip INT UNSIGNED,
StopoffNumber INT UNSIGNED,
Location INT UNSIGNED,
PRIMARY KEY (Trip, StopoffNumber),
CONSTRAINT Constr_TripStopoff_Trip_fk
FOREIGN KEY TripStopoff_Trip_fk (Trip)
REFERENCES Trip (ID),
CONSTRAINT Constr_TripStopoff_Location_fk
FOREIGN KEY TripStopoff_Location_fk (Location)
REFERENCES Location (ID)
) ENGINE=INNODB CHARACTER SET ascii
INSERT INTO
Location
(ID, Name)
VALUES
(1, 'Chicago'),
(2, 'Manoning'),
(3, 'Jersey City'),
(4, 'Newark'),
(5, 'New York')
INSERT INTO
Trip
(ID, Name, StartLocation, EndLocation)
VALUES
(1, 'My trip', 1, 5)
INSERT INTO
TripStopoff
(Trip, StopoffNumber, Location)
VALUES
(1, 1, 2),
(1, 2, 3),
(1, 3, 4)