【问题标题】:Incorporating taggable person names into a database将可标记的人名合并到数据库中
【发布时间】:2014-07-06 00:50:48
【问题描述】:

第一次发帖,第一次使用关系数据库,所以要温柔!

正在处理相关小说小说的数据库,我遇到了一些责任人,例如作者或插画家或序言作者。

我想将人员存储在“人员”表中,包括名字和姓氏,但是当用户将一本新书输入数据库时​​,我希望负责人的行为几乎像标签一样,并出现一个自动完成的列表以及允许他们输入新作者...在一个字段中,而不是两个。

此外,每个人都有一个与该书相关的角色。带有“book_id”、“person_id”和“role_id”的表“book-person-role”有什么严重问题吗?或者我应该把它分成两个表,“book-person”和“person-role”,这个“person-role”表链接到“book-person”表的主ID?

【问题讨论】:

    标签: php mysql database-design database-schema


    【解决方案1】:

    首先是第二个问题:

    此外,每个人都会有一个与该书相关的角色。带有“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";
    }
    

    【讨论】:

    • 哦,对不起。有时我有点密集。我正在用 mySQL 编写 PHP。我知道有一个用于将作者与书籍相关联的数据透视表......我最关心的是如何存储作者数据,主要是姓名,以允许通过姓氏的字母排序以及单个输入字段用户。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-11
    • 2020-02-03
    • 2013-06-07
    相关资源
    最近更新 更多