我正在尝试创建一个数据库来管理公共汽车数据
CREATE TABLE Company(
Company_Name VARCHAR(12),
Tel INT,
PRIMARY KEY(Company_Name)
);
CREATE TABLE Line(
ID_Line VARCHAR(3),
NCompany_Name VARCHAR(12),
Desc TEXT,
PRIMARY KEY(ID_Line, Company_Name),
FOREIGN KEY (Company_Name) REFERENCES Company(Company_Name)
);
CREATE TABLE Stop(
ID_Stop VARCHAR(3),
geoLat FLOAT(10,6),
geoLong FLOAT(10,6),
PRIMARY KEY(ID_Stop)
);
CREATE TABLE Make(
ID_Stop VARCHAR(3),
ID_Line VARCHAR(3),
Hour TIME,
PRIMARY KEY(ID_Stop,ID_Line),
FOREIGN KEY (ID_Stop) REFERENCES Stop(ID_Stop),
FOREIGN KEY (ID_Line) REFERENCES Line(ID_Line)
);
问题是公共汽车在不同时间停在同一站几次,我怎么能存储这些信息以避免冗余?
例如:
Id_Line = 1
ID_Stop = 1
Hour = 4:50
比
Id_Line = 1
ID_Stop = 1
Hour = 5:20
但这不可能,我想添加另一个名为ID的字段(自动增量),但我不知道它是否是最佳解决方案。你有什么建议吗?
答案 0 :(得分:1)
您对谓词感兴趣&#34; [ID_Line]在时间[小时]&#34;停在[Id_Stop]。按定义生成的表格可以保存使其成为真的行。它唯一的候选键(因此主键)是(ID_Stop,ID_Line,Hour),因为没有其他列的子集是唯一的。您的图表应包括小时(根据您使用的任何图表约定)。对于(ID_Stop,ID_Line)对(其不会识别Make的行,但是停止的行停止对)或(ID_Stop,ID_Line,Hour)三元组的ID,没有特别的好处。< / p>
问题是公共汽车在同一站停了好几次 不同的时间,我怎么能存储这些信息避免 冗余?
没有这样的问题。无论是否存在&#34;冗余&#34;,子表在表中都可以出现多次。 (无论你认为这意味着什么。虽然可以用ids和另一个表替换多次出现的 subrows ,但是对于相同的查询结果,需要更多 join 。请参阅{{ 3}}。)
答案 1 :(得分:0)
这是我与
一起使用的设计CREATE TABLE Company(
CompanyID SMALLINT IDENTITY(1,1),
CompanyName NVARCHAR(12),
Tel INT,
PRIMARY KEY(CompanyID)
);
CREATE TABLE Line(
LineID INT IDENTITY(1,1),
Code CHAR(3),
CompanyID SMALLINT,
Desc NVARCHAR(MAX),
PRIMARY KEY(LineID),
);
CREATE TABLE [Stop](
StopID INT IDENTITY(1,1),
geoLat NUMERIC(9,6),
geoLong NUMERIC(9,6),
PRIMARY KEY(StopID)
);
CREATE TABLE Make(
MakeID INT IDENTITY(1,1),
StopID INT,
LineID INT,
[Hour] SMALLINT,
PRIMARY KEY(MakeID),
);
我做出的改变以及原因:
就冗余数据而言,不要因为炒作而堕落。有一个时间和地点进行标准化,并不是每个时间都有。添加另一个表以消除到达时间的冗余实际上会导致数据库变大,而不是更小。