首先是第二个问题:
此外,每个人都会有一个与该书相关的角色。带有“book_id”、“person_id”和“role_id”的表“book-person-role”有什么严重问题吗?
如果您只有一个 role_id 连接到 book_id 和 person_id,您可以使用一张表。连接表很慢,通常您拥有的表越少,它的工作速度就越快(如果其他一切都没有改变)。在这种特殊情况下,行数不会增加。因此,拥有一张桌子并没有什么问题,而且您甚至还有一个好处:它工作得更快。
关于第一个问题。如果您有书籍与人的多对一关系,您应该为书籍和人使用不同的表。你可以做任何你喜欢的用户界面。您可以加入表格,提出多个请求。您没有说明您使用的是什么编程语言,所以我无法帮助您为您想要的用户界面编写代码。
编辑:
您建议制作 person 表的方式(first_name 和 last_name 作为不同的字段)是一个好方法。当您想查找一个人时,您对服务器进行 AJAX 调用,服务器使用 OR 并返回列表。例如,您想在#name_input 输入标签中查找名称。
HTML:
<input id="name_input" type='text' />
JavaScript:
$(document).on('keydown','#name_input',function(){
var jqxhr = $.ajax( "name_lookup.php?name="+$("#name_input").val())
.done(function(data, textStatus, jqXHR) {
alert( "add data to your lookup list" );
})
.fail(function() {
alert( "error" );
})
});
PHP:
$name = mysql_real_escape_string($_GET['name']);
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
if ($result = $mysqli->query(
"SELECT id, first_name, last_name FROM persons WHERE first_name = $name OR last_name = $name ORDER BY last_name"
)) {
$rows = array();
while($row = $result->fetch_assoc()) {
$rows[] = $row;
}
echo json_encode($rows);
}else{
echo "Error";
}