- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
直接进入这个。我有一张表,用于表示一种“喜欢”的功能。这张表自然有以下内容:
Name | Type | Attributes | (Comment)
Post ID | int | index | ID of the post which was "Liked"
Topic ID | int | index | ID of the topic which contains the "Liked" post
Member ID | int | index | ID of the member who "Liked" the post
Date | bigint | index | Date/time of "Like"
如您所见,没有主键。这似乎很自然。唯一需要执行的功能是插入(表示“喜欢”)、删除(表示“不喜欢”)以及按帖子或提供点赞的成员按最近点赞的顺序搜索点赞。
每个条目显然都非常“独特”——因为每个人每个帖子只需要一个赞。似乎完全不需要唯一的主索引,就好像重复项(以某种方式)发生一样,我想将它们全部删除,而不仅仅是具有特定 ID 的索引。和插入一样,没有人可以喜欢同一件事两次。这些“喜欢”只会使用来自其他表的索引来选择。
然而,phpMyAdmin 现在禁止我进行任何手动编辑、复制或删除。这也很好,但促使我进一步查找没有主键的逻辑。当我找到一个 stackoverflow 答案时,普遍的看法是不需要主键的情况“非常罕见”。
所以,要么我发现了这些非常罕见的时刻之一,要么根本不那么罕见。我的场景看起来很简单和常见,所以应该有一个更明确的答案。这样一切看起来都很自然,我永远不需要实际使用主键。因此,我认为没有一个会更简单。我是否忽略了 MySQL 的任何真正神秘(并且有些神奇)的方式?或者我是否可以安全地省略一个无用的自动递增主 ID key (无论如何,它可能会在任何当前使用的 ID 之前达到其极限)至少直到我找到它们的用途(从不)?
最佳答案
您说过帖子 ID 和成员(member) ID 定义了列的唯一性(并且主题 ID 是次要的,只是为了方便而包含)。
那么,为什么不在 (Post ID, Member ID)
上设置一个主键呢?如果您已经对它们设置了 UNIQUE
ness 约束,那么这不是一个很大的飞跃。
CREATE TABLE `Likes` (
`PostID` INT UNSIGNED NOT NULL,
`TopicID` INT UNSIGNED NOT NULL,
`MemberID` INT UNSIGNED NOT NULL,
`Date` DATETIME NOT NULL,
PRIMARY KEY (`PostID`, `MemberID`),
FOREIGN KEY (`PostID`) REFERENCES `Posts` (`ID`) ON DELETE CASCADE,
FOREIGN KEY (`MemberID`) REFERENCES `Members` (`ID`) ON DELETE CASCADE
) Engine=InnoDB;
(我对 TopicID
的了解还不够,无法为其提出关键约束,但您可能希望添加一些。)
当然,添加任意的自动递增字段是没有意义的,但这并不意味着您不能拥有有意义的主键。
顺便说一句,我会考虑删除 TopicID
字段;如果您的外键设置正确,那么在没有它的情况下进行后<->主题查找应该是微不足道的,在这种情况下,您正在复制数据并违反关系模型!
关于mysql - 完全唯一行的表的主键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24184840/
猫f1.txt阿曼维沙尔阿杰贾伊维杰拉胡尔曼尼什肖比特批评塔夫林现在输出应该符合上面给定的条件 最佳答案 您可以在文件读取循环中设置一个计数器并打印它, 计数=0 读取行时做 让我们数一数++ if
我正在尝试查找文件 1 和文件 2 中的共同行。如果公共(public)行存在,我想写入文件 2 中的行,否则打印文件 1 中的非公共(public)行。fin1 和 fin2 是这里的文件句柄。它读
我有这个 SQL 脚本: CREATE TABLE `table_1` ( `IDTable_1` int(11) NOT NULL, PRIMARY KEY (`IDTable_1`) );
我有 512 行要插入到数据库中。我想知道提交多个插入内容是否比提交一个大插入内容有任何优势。例如 1x 512 行插入 -- INSERT INTO mydb.mytable (id, phonen
如何从用户中选择user_id,SUB(row, row - 1),其中user_id=@userid我的表用户,id 为 1、3、4、10、11、23...(不是++) --id---------u
我曾尝试四处寻找解决此问题的最佳方法,但我找不到此类问题的任何先前示例。 我正在构建一个基于超本地化的互联网购物中心,该区域分为大约 3000 个区域。每个区域包含大约 300 个项目。它们是相似的项
preg_match('|phpVersion = (.*)\n|',$wampConfFileContents,$result); $phpVersion = str_replace('"','',
我正在尝试创建一个正则表达式,使用“搜索并替换全部”删除 200 个 txt 文件的第一行和最后 10 行 我尝试 (\s*^(\h*\S.*)){10} 删除包含的前 10 行空白,但效果不佳。 最
下面的代码从数据库中获取我需要的信息,但没有打印出所有信息。首先,我知道它从表中获取了所有正确的信息,因为我已经在 sql Developer 中尝试过查询。 public static void m
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我试图在两个表中插入记录,但出现异常。您能帮我解决这个问题吗? 首先我尝试了下面的代码。 await _testRepository.InsertAsync(test); await _xyzRepo
这个基本的 bootstrap CSS 显示 1 行 4 列: Text Text Text
如果我想从表中检索前 10 行,我将使用以下代码: SELECT * FROM Persons LIMIT 10 我想知道的是如何检索前 10 个结果之后的 10 个结果。 如果我在下面执行这段代码,
今天我开始使用 JexcelApi 并遇到了这个:当您尝试从特定位置获取元素时,不是像您通常期望的那样使用sheet.getCell(row,col),而是使用sheet.getCell(col,ro
我正在尝试在我的网站上开发一个用户个人资料系统,其中包含用户之前发布的 3 个帖子。我可以让它选择前 3 条记录,但它只会显示其中一条。我是不是因为凌晨 2 点就想编码而变得愚蠢? query($q)
我在互联网上寻找答案,但找不到任何答案。 (我可能问错了?)我有一个看起来像这样的表: 我一直在使用查询: SELECT title, date, SUM(money) FROM payments W
我有以下查询,我想从数据库中获取 100 个项目,但 host_id 多次出现在 urls 表中,我想每个 host_id 从该表中最多获取 10 个唯一行。 select * from urls j
我的数据库表中有超过 500 行具有特定日期。 查询特定日期的行。 select * from msgtable where cdate='18/07/2012' 这将返回 500 行。 如何逐行查询
我想使用 sed 从某一行开始打印 n 行、跳过 n 行、打印 n 行等,直到文本文件结束。例如在第 4 行声明,打印 5-9,跳过 10-14,打印 15-19 等 来自文件 1 2 3 4 5 6
我目前正在执行验证过程来检查用户的旧密码,但问题是我无法理解为什么我的查询返回零行,而预期它有 1 行。另一件事是,即使我不将密码文本转换为 md5,哈希密码仍然得到正确的答案,但我不知道为什么会发生
我是一名优秀的程序员,十分优秀!