为动态数据或更好的解决方案创建20个相关表 - MySQL

时间:2014-12-03 09:03:16

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

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

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

  
      
  1. 影      
        
    1. 名称
    2.   
    3. 类型//喜欢科幻,惊悚,喜剧,浪漫
    4.   
    5. 网址[如果有]
    6.   
  2.   
  3. 音乐      
        
    1. 名称
    2.   
    3. 类型
    4.   
    5. 网址[如果有]
    6.   
  4.   
  5. 菜      
        
    1. 名称
    2.   
    3. 类型
    4.   
    5. 网址[如果有]
    6.   
  6.   
  7. 运动      
        
    1. 名称
    2.   
    3. 类型
    4.   
    5. 网址[如果有]
    6.   
  8.   

等,

这个最喜欢的名单可以增长更多&对于每个收藏夹。

以上这些列将针对每个喜爱的项目。我目前的解决方案是为每个喜欢的东西创建表格,如[喜欢的电影,喜欢的体育等]。但是,由于这些最喜欢的项目可能会增加,我不想再从MySQL创建另一个表。

所以,我正在寻找解决方案,例如,创建名为just的表,"收藏",以及列: -

  
      
  1. 名称。
  2.   
  3. 页面链接。
  4.   
  5. 类型。
  6.   

这些名字可以是"电影","书籍"等等,并在每部电影"或"书籍",将有所有数据。这些数据将链接到不同的用户。

因此,我需要通过创建更少的表来帮助设置表关系模式。

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

  1. MySQL for Database /
  2. PHP for Server端。

3 个答案:

答案 0 :(得分:1)

我接近这个的方式。

______________________________________________________________
| 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();
            }
        }
    }
}

}

可能会考虑一些适用于您的情况。但我希望它有用

答案 1 :(得分:1)

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

enter image description here

答案 2 :(得分:0)

你可以创建一个主表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 |