组织表避免冗余

时间:2015-05-29 16:48:46

标签: database database-design logic store database-schema

我正在尝试创建一个数据库来管理公共汽车数据 E/R

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的字段(自动增量),但我不知道它是否是最佳解决方案。你有什么建议吗?

2 个答案:

答案 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),
);

我做出的改变以及原因:

  1. 切换到使用标识列,因为INT小于VARCHAR(3);这对索引一次又一次地支付。
  2. 将VARCHAR切换到NVARCHAR。现在增加了国际潜力。
  3. Desc现在是NVARCHAR(MAX),因为TEXT是不推荐使用的数据类型,不应该使用。你真的需要那么大的领域来描述吗?如果没有,请缩小尺寸。
  4. 主键已更新为缩进列
  5. 小时从TIME格式更改为SMALLINT,因为它是一个较小的数据类型,我怀疑您需要估计超出公交车到达的时间。 (1720 = 5:20PM)
  6. 您的坐标被删除为数字(9,6)。这应该以尽可能小的数据类型提供所需的精度。
  7. 就冗余数据而言,不要因为炒作而堕落。有一个时间和地点进行标准化,并不是每个时间都有。添加另一个表以消除到达时间的冗余实际上会导致数据库变大,而不是更小。