【问题标题】:Creating 20 Related Table for Dynamic Data or Better Solution - MySQL为动态数据创建 20 个相关表或更好的解决方案 - MySQL
【发布时间】:2015-01-31 18:21:45
【问题描述】:

我正在为以下要求寻找更好的解决方案。

我必须存储用户最喜欢的东西,例如 -

  1. 电影
    1. 姓名
    2. 类型 // 喜欢科幻、惊悚、喜剧、浪漫
    3. 网址 [如果有的话]
  2. 音乐
    1. 姓名
    2. 类型
    3. 网址 [如果有的话]
  3. 美食
    1. 姓名
    2. 类型
    3. 网址 [如果有的话]
  4. 运动
    1. 姓名
    2. 类型
    3. 网址 [如果有的话]

等等,

这个最喜欢的列表可以增加更多&对于每个最喜欢的。

以上这些列将针对每个最喜欢的项目。我当前的解决方案是为每个喜欢的事物创建表格,例如 [最喜欢的电影、最喜欢的运动等]。但是随着这些最喜欢的项目可能会增加,我不想再从 MySQL 为它创建另一个表。

所以,我正在寻找解决方案,例如,用名称创建表,“收藏夹”,列:-

  1. 姓名。
  2. 页面链接。
  3. 类型。

那些名字可以是“movies”、“books”等,而在每个“movie”或“books”里面,都会有所有的数据。这些数据将链接到不同的用户。

因此,我需要通过创建更少的表来帮助设计具有关系的表架构。

编程语言,我正在使用:-

  1. 用于数据库的 MySQL/
  2. 用于服务器端的 PHP。

【问题讨论】:

    标签: php mysql database-design relational-database database-schema


    【解决方案1】:

    您可以创建一个主表tbl_favoritemaster 来存储最喜欢的项目列表(例如电影、书籍等...),并使用子表tbl_favoritedetail 来存储用户最喜欢的东西(例如用户明智的电影详细信息、用户明智的书籍细节等...)。使用这种结构,您无需为所有收藏项目列表创建更多表格。

    1. tbl_favoritemaster

    Column List: favoriteId (PK), favoriteName
    Data: 
    
    | favoriteId | favoriteName |
    |      1     | Movie        |
    |      2     | Book         |
    

    2。 tbl_favoritedetail

    Column List: Id (PK), favoriteId (Reference to tbl_favoritesmaster), Name, Type, URL
    Data: 
    
    | Id | favoriteId | Name | Type | URL  |
    |  1 |    1       | M1   |  T1  | URL1 |
    |  1 |    2       | B1   |  T2  | URL2 |
    

    【讨论】:

      【解决方案2】:

      我将采取的方法。

      ______________________________________________________________
      | UniqueID | FavouriteID | Data | Name    | Page Link | Type |
      | Int(11)  | Int(11)     | Blob | varchar | Varchar   | Int? |
      ______________________________________________________________
      

      第二张桌子

      ___________________________
      | UniqueID | FavouritName |
      | INT(11)  | VarChar      |
      ___________________________
      

      在表 2 UniqueID 和表 1 FavouritID 之间创建一个外键

      通过 PHP 访问时,我自己使用这组函数

      function RDataLink($field, $table, $current=""){
      accessDB();
          $QTable=mysql_query("SHOW CREATE TABLE $table");
          $Table=mysql_result($QTable,0,1);
      exitDB();
      // CONSTRAINT `jobSeeker_ibfk_1` FOREIGN KEY (`location`) REFERENCES `24_location` (`UID`)
      $x=preg_match_all('/FOREIGN[^(]+.[^(]+[^)]+./',$Table,$matches);
      foreach ($matches as $array){
          foreach ($array as $value){
              if(preg_match("/(?<=FOREIGN\sKEY.{3})$field/",$value)){
                  if (preg_match("/(?<=REFERENCES[^`].)[^`]+/",$value,$ForeignTable)){
                      accessDB();
                          $Qrows=mysql_query("SELECT * FROM ".$ForeignTable[0]);
                      exitDB();
                      $options="<select name=\"$field\">";
                      while ($rows=mysql_fetch_array($Qrows,MYSQL_ASSOC)){
                          $options.="<option value=\"".$rows['UID']."\"".($current==$rows['UID'] ? "selected" : "") .">".$rows['name']."</option>";
                      }
                      $options.="</select>";
                  }
              }
          }
      }
      if(!$x){
          return false;
      }
          else {
          return $options;
      }
      }
      
      function RQuery($field,$table,$current){
      accessDB();
          $QTable=mysql_query("SHOW CREATE TABLE $table");
          $Table=mysql_result($QTable,0,1);
      exitDB();
      $x=preg_match_all('/FOREIGN[^(]+.[^(]+[^)]+./',$Table,$matches);
      foreach ($matches as $array){
          foreach ($array as $value){
              if(preg_match("/(?<=FOREIGN\sKEY.{3})$field/",$value)){
                  if (preg_match("/(?<=REFERENCES[^`].)[^`]+/",$value,$ForeignTable)){
                      accessDB();
                          $Qrow=mysql_query("SELECT name FROM ".$ForeignTable[0]." WHERE UID='$current'");
                          return mysql_result($Qrow,0);
                      exitDB();
                  }
              }
          }
      }
      
      }
      

      可能需要一些研究以适用于您的情况。但我希望它会有所帮助

      【讨论】:

        【解决方案3】:

        由于电影、音乐...可能具有不同的属性,因此有一个有利实体的基表可以服务:

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-11-21
          • 1970-01-01
          • 1970-01-01
          • 2020-02-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多