我正在为用户提交数据的web应用程序构建数据库。每个数据都是唯一的,并且多个用户可以提交相同的数据。
从应用程序的角度来看,了解用户提交数据的顺序很重要。
我专门为此做了一张桌子。它有以下字段:

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

我的问题是,我应该将哪些属性作为主键?
SubmissionIDUserID允许对一对SubmissionOrder重复(SubmissionID, UserID)s。
SubmissionIDSubmissionOrder将允许同一用户提交同一内容两次。
UserIDSubmissionOrder…将大大限制用户提交的内容:P
三者都允许对不同的SubmissionOrders重复UserIDs。
有没有另一个我没有考虑的解决办法?
这个问题在应用程序层面上解决得更好吗?有触发器吗?
谢谢你抽出时间!
注:一些技术细节,我怀疑你会发现有用的:
应用程序是用php编写的
数据库在sqlite3上运行

最佳答案

在大多数sql平台上,事情发生的顺序只是有点模糊。据我所知,没有一个sql平台能同时保证这两个需求。
一定没有领带。
以前的提交必须总是看起来比以后的提交早。
对于时间戳列,较早的提交看起来总是比较晚的提交要早。但是很容易有两个具有相同时间戳值的“提交”,不管dbms时间戳的分辨率有多高。
使用序列号(或自动递增的数字)时,将没有连接。但是sql平台不能保证序列号为2的行在序列号为3的行之前提交。这意味着,如果同时记录序列号和时间戳,则可能会找到一对行,其中序列号较低的行也具有较新的时间戳。
但是sqlite并不完全是sql,所以它可能是这个一般规则的一个例外。
在sqlite中,写入数据库的任何进程。我认为,锁定数据库意味着您可以依赖于locks the whole database的时间增长。
所以我认为您正在查看{submissionid,userid}的主键,其中rowid()决定提交顺序。但我可能错了。

10-06 12:41
查看更多