具有提交ID,用户ID和提交顺序的表的主键

时间:2011-10-11 21:38:22

标签: database database-design relational-database

我正在为用户可以提交数据的Web应用程序构建数据库。每个数据都是唯一的,并且多个用户可以提交相同的数据。

从应用程序的角度来看,重要的是要了解用户提交数据的顺序。

我专门为此目的制作了一张桌子。它包含以下字段:

SubmissionID
UserID
SubmissionOrder
... # and other non-important ones

我的问题是,我应该使用哪些属性制作主键?

SubmissionIDUserID会允许SubmissionOrder对重复(SubmissionID, UserID)次。

SubmissionIDSubmissionOrder会允许同一个用户提交两次相同的内容。

UserIDSubmissionOrder ...会严格限制用户提交的内容:P

对于不同的SubmissionOrder s,所有三个都允许重复UserID

还有其他解决方案我不在思考吗?

在应用程序级别更好地解决了这个问题吗?有触发器吗?

感谢您的时间!

PS:我怀疑你会发现有用的一些技术细节:

  • 该应用程序以 PHP
  • 编写
  • 数据库在 sqlite3
  • 上运行

3 个答案:

答案 0 :(得分:1)

关于您的具体问题:

  

从应用程序的角度来看,重要的是要知道用户提交数据的顺序

我认为有两个替代选项而不是组合字段主键:

(1)创建一个附加列 - 一个整数(自动增量)主键。

(2)创建一个时间戳字段并保存输入数据的日期/时间。

答案 1 :(得分:1)

在大多数SQL平台上,事情发生的顺序有点模糊。据我所知,没有SQL平台可以保证这两个要求。

  • 必须没有联系。
  • 早期提交的内容必须始终比以后的提交更早。

使用timestamp列,早期提交的内容看起来总是比以后的提交更早。但是,无论dbms的时间戳的分辨率有多精细,都可以很容易地获得两个具有相同时间戳值的“提交”。

使用序列号(或自动递增数字),将没有联系。但是,SQL平台不保证在序列号为3的行之前提交序列号为2的行。这意味着,如果同时记录序列号和时间戳,则可能会找到行所在的行对 lower 序列号也具有以后的时间戳。

但是SQLite并不是SQL,所以它可能是这个一般规则的一个例外。

在SQLite中,任何写入数据库locks the whole database的进程。我认为锁定数据库意味着你可以依靠rowid()暂时增加。

所以我你正在查看{SubmissionID,UserID}的主键,其中rowid()确定提交顺序。但我可能是错的。

答案 2 :(得分:1)

所以您有提交的数据(SubmissionId?),您希望允许重复项(以便其他用户可以提交重复数据),但不能为单个用户提供重复项。这要求对(SubmissionId,UserId)进行唯一约束。

您的下一个要求是“了解用户提交数据的顺序”。目前还不清楚所有提交是否属实,或者只有具有重复*的提交是否属实。解决一般情况(所有提交)解决了具体问题 - 所以我们将继续这样做。

由于这是一个排序问题,SQL并没有真正处理,你需要添加一个能给你绝对排序的属性。 2个标准选择是自动增量或时间戳。我们将选择一个自动增量,以便您不必担心关系。我假设SubmissionOrder是你的占位符。由于我们使用了自动增量色谱柱,因此它保证是唯一的。因此,我们在(SubmissionOrder)上有另一个唯一约束。

这些独特的约束现在是您的候选键。选择一个作为主键,并为另一个使用唯一约束。

*您对重复SubmissionOrder的评论稍微混淆了一点 - 建议SubmissionOrder仅对SubmissionId是唯一的。假设您有应用程序逻辑来创建下一个SubmissionOrder,这是一个有效的(虽然稍微更难)替代。然后,您的唯一约束将最终开启(SubmissionId,SubmissionOrder)。