数据库表设计问题?

时间:2013-11-28 11:26:20

标签: mysql sql database

我正在创建一个以name为列的表,以便有多个行具有相同的名称,并且对应于每个名称,还有其他值(列)。

我必须设计表格,以便有两组值默认最新。因此,用户可以查询获取默认/最新设置,并可以编辑表以使特定的值集合作为默认值替换先前的defult集。

我正在考虑通过将标志列保留在以下位置来实现此目的: 0表示此行是默认设置,1表示最新设置,2表示只是一般行。

TABLE:

NAME            ADDRESS         CITY         FLAG

Hansen          Timoteivn 10    Sandnes      1   (LATEST)   
Hansen          street 13       texas        0   (DEFAULT)
Svendson        Borgvn 23       Sandnes      1   (LATEST)
Svendson        street 14       colaba       2   (GENERAL)
Svendson        street 15       Houston      0   (DEFAULT)
Pettersen       Storgt 20       Stavanger    0   (DEFAULT)
Pettersen       Storgt 21       texas        1   (LATEST)

我正在考虑像这样实现它:

alter table TABLE_NAME add flag number CONSTRAINT <constraintname>
   CHECK (flag IN (0, 1, 2));

除了保持标志之外,还有更好的方法吗? 我做错了吗?

4 个答案:

答案 0 :(得分:1)

  

除了保持旗帜之外,还有更好的方法吗?

通常,默认设置将由标志列显示,但不会显示有关最新信息的信息。

要存储最新信息,表格中会包含2个额外的时间戳列:已创建已修改(您可能还有两个列,其中显示了CreatedBy,ModifiedBy等人员。)< / p>

如果你有这些审核专栏,那么找出最新的只是查看这些时间戳的问题,具体取决于最近创建或最近修改的最新方式。

答案 1 :(得分:0)

  

除了保持旗帜之外,还有更好的方法吗?我做错了吗?

如果您无法以任何其他方式区分“默认”数据和“最新”数据,则必须添加列或添加表格。

但我不明白你为什么选择使用整数的方式。您使用三个不同的整数表示两个不同的值。

答案 2 :(得分:0)

根据您的建议,没有什么可以阻止您存储多个默认值或最新版本。您也没有合适的主键。

更好(更关系)的解决方案是:a)在你的表中添加某种版本,b)用PK(名称+版本是默认副本)创建另一个表,将这两列作为主要和&amp;外键。 “最新”只是具有最高版本的行,而不是标志。这将为您提供更好的数据完整性。但是,它将允许给定密钥可能没有默认值的情况。

强制您必须重新设计您的表以获得父记录(名称),一些子记录(其他内容)以及父母指向默认值的FK。根据您的数据库是否支持延迟约束(我不知道MySQL),由于循环性质,这可能无法实现。

答案 3 :(得分:0)

您的架构缺少用于存储唯一名称的表。

如果您创建一个,那么您可以拥有一个引用它的地址表,并且假设每个“name”只能有一个“最新”和一个“默认”行,您可以在名称表中添加列以进行链接到最新和默认的地址行。

当然,如果最新的意思是“最后添加到表中”,则添加时间戳来创建地址意味着您可以从中推断出最新的行。