我正在为用户可以提交数据的Web应用程序构建数据库。每个数据都是唯一的,并且多个用户可以提交相同的数据。
从应用程序的角度来看,重要的是要了解用户提交数据的顺序。
我专门为此目的制作了一张桌子。它包含以下字段:
SubmissionID
UserID
SubmissionOrder
... # and other non-important ones
我的问题是,我应该使用哪些属性制作主键?
SubmissionID
和UserID
会允许SubmissionOrder
对重复(SubmissionID, UserID)
次。
SubmissionID
和SubmissionOrder
会允许同一个用户提交两次相同的内容。
UserID
和SubmissionOrder
...会严格限制用户提交的内容:P
对于不同的SubmissionOrder
s,所有三个都允许重复UserID
。
还有其他解决方案我不在思考吗?
在应用程序级别更好地解决了这个问题吗?有触发器吗?
感谢您的时间!
PS:我怀疑你会发现有用的一些技术细节:
答案 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)。