在我的数据库中,有一个表格基本上包含问题及其选项和答案。第一个字段是 ~questionid~ 并且是主键,正如预期的那样(我现在禁用了 AUTOINCREMENT)。我的客户可能想删除一些问题。这给我留下了两个选择:
所有后续问题都向上移动,因此没有空行。此选项意味着这些问题将更改其问题 ID
保持原样,这样会有空行。如果有一个新条目,它应该填充第一个空行。
我该如何实施其中的任何一个?实际上,我更喜欢第二种,但如果有人有不同的意见,欢迎提出。
我正在使用 MySQL 数据库和 C#。
您正在使用数据库,因此您不必担心这些问题。
SQL 表中没有“空”行的概念(好吧,可以说如果所有列都是 NULL 则该行是空的,但这在这里不相关)。SQL 表中的行本身并不是有序的。
行本身存储在页面上,这些页面可能有也可能没有额外的空间来容纳更多的行。当您想到空行时,这可能就是您所想到的。
删除一行时,数据不会重新排列。页面上只有一些额外的空间,以防以后添加新行。如果您在两个现有行之间添加带有主键的新行,并且页面已满,则数据库将页面“拆分”为两部分。另外两个页面有额外的空间。
然而,重要的一点不是它是如何工作的。您为应用程序使用关系数据库的一个原因是您可以添加和删除行,而不必担心它们的实际物理存储。
如果您有一个包含大量事务(删除和插入)的数据库,那么您可能希望定期重新排列数据以使其更适合页面。但是,通常只有在此类交易量很大时才需要进行此类优化。
不过有一件事。您的应用程序不应依赖于顺序的主键,因此它可以正确处理删除。
我不确定你是如何实施的。我会这样做,
questions
question_id - pk
question
answers
answer_id - pk
answers
question_answer
question_id
answer_id
这将带来更多优势。许多问题会有相同的答案。如果可以删除问题,则从 question_answer 表中删除它们及其答案