在一个有多对多关系的数据库中(例如3个这样的表格)
Book | Author | BookAuthor
_____ | ______ | __________
BookId | AuthorId | BookId
Title | Name | AuthorId
... | ... |
我想要一个表单来创建一本新书。在该表格中,用户将输入关于书籍的信息(标题等),并且他们将通过相同的表格选择书籍的作者。
在这样的情况下,你什么时候在Book表中插入?你是这样做的:
您访问该表单,以便获得BookId,并且可以在用户添加作者时插入BookAuthor表中吗?
仅在用户离开表单时进行(您在Book中插入然后在BookAuthor中插入)?
使用1时,您可能会收到大量不需要的记录,因为即使用户离开页面或点击取消也会创建记录。
使用2,你没有BookId,所以你不能开始插入BookAuthor表,直到整个表格被填满(那时你不能真正使用AJAX)。
这似乎是一种相当普遍的情况,所以我想有一种正确的方法可以做到这一点?
编辑:可以添加作者,就像标题被添加到Stack Overflow(自动完成框)中的问题一样,就像在答案中建议的那样。您添加了一个标记,但无法立即插入,因为该数据库中尚不存在该问题。因此,当您提交问题时,我猜测自动完成框的内容将被解析,并且同时插入两个(标记和问题)。我不知道它是如何在SO(解析或其他)上完成的,但这基本上就是我想要找到的。
答案 0 :(得分:1)
我绝对不会建议#1,因为你说的原因,并且只是没有逻辑意义。
我建议#2,或#2的演变。
首先,我想知道为什么你想要/需要用AJAX做这件事 - 与你的最终陈述相反,它当然是可能的 - 但你的简化例子也可以用简单的HTML表格提交。
无论如何,这取决于作者的创作方式。您是否希望允许用户同时创建作者条目,或者除此之外? (我假设后者)。
如果我正在做这个项目,我可能想让用户创建图书条目并从自动完成作者框中选择。我还想让他们从那个盒子里创建任何新的作者条目。例如,如果他们输入的作者姓名不在作者表中,系统将创建一个新条目。
如果作者条目尚不存在,您需要创建一个新条目,这将为您提供新的作者ID。
获得作者ID后(通过查找现有ID或创建新ID),您可以创建图书条目。完成后,您将获得图书ID,此时您可以在BookAuthor中添加参考。
您可能希望将此全部包装在事务中,然后在创建BookAuthor条目后提交。
您可能希望为ID使用自动增量列,并且在链接到BookAuthor表时,您可能希望对ID列使用外键约束。
除此之外,您可以使用AJAX进行任何客户端到服务器的通信 - 这只是从浏览器与服务器通信的一种方式。
答案 1 :(得分:0)
您的AJAX调用将点击插入Book表格中的页面然后插入您的BookAuthor表格。这两个查询都将在事务中完成,以维护主/外键关系的完整性。
根据您的数据库,Book表中的BookID可以通过多种方式获得。您可以在Book表插入后查询它。
从Book
中选择Max(BookID)作为DRAWID
或者,如果您使用的是Oracle,则可以先插入序列,然后再插入Book表。
从双
中选择BookID_SEQ.nextval
然后,您可以在Book表插入中使用此序列号以及BookAuthor插入。
所有这些查询都必须在一个交易中被调用,所以一些鬼鬼祟祟的玩家不会潜入你身后窃取你的Max(BookID)或增加你的序列。