关系数据库设计,几个表的一个元表?

时间:2017-10-03 08:50:15

标签: mysql database database-design relational-database

我对数据库设计了解不多,最近我得到了一个承诺需要庞大数据库的项目,我对设计标准数据库结构(mysql)的最佳方式感到困惑。

例如,假设我们有3个表:用户,商店,产品 这些(用户,商店,产品)中的每一个都可能有一个或多个细节,如社交页面链接(用于商店),电话号码(用于用户),地址(用于商店和用户),颜色\材料(用于产品)等...

我应该只创建一个元表并将所有细节存储在其中,还是应该为每个表创建单独的元表?(user_meta,shop_meta,product_meta)。 哪一个更好的方法?

任何意见和建议都将不胜感激。

修改

根据Branko Dimitrijevic先生的说法,每张桌子都应该有自己的元表。

我的问题是用户可能有以下几种类型的详细信息:社交页面网址,用户地址,用户角色等...

可以像这样设计数据库:

**Table: USERS**

userId | username | email | pass


**Table: USERS_META**

userId | metaType | metaValue

metaType将是用户可以拥有的不同类型的详细信息,例如地址,Instagram页面,Facebook页面等...

例如USERS_META表中的记录如下:

userId |   metaType   |       metaValue
---------------------------------------------------
2      |  address     | some address for user home
---------------------------------------------------
2      |  role        | 1(id of the role)
---------------------------------------------------
2      |  instagram   | instagram.com/userpage
---------------------------------------------------
3      |  address     | some address for user 3 home
---------------------------------------------------
3      |  facebook    | facebook.com/userpage
---------------------------------------------------
3      |  role        | 2(id of the role)
---------------------------------------------------
2      |  age         | 18
---------------------------------------------------
3      |  age         | 19

现在,如果我想要用户2的地址:

SELECT metaValue FROM USERS_META WHERE userId=2 AND metaType='adress'

如果我想要用户社交页面链接:

$array=array('facebook','instagram','telegram','etc');
SELECT metaValue FROM USERS_META WHERE userId=2 AND metaType IN($array)

这是一个好方法,还是应该为每个元创建单独的表(USER_ADDRESSES,USER_SOCIAL,USER_AGE等...)?

1 个答案:

答案 0 :(得分:1)

简而言之:你不应该“合并”多个表。

即使它们恰好具有相同的字段,它们几乎肯定没有相同的约束(例如,从其他表指向它们的外键)。