我对数据库设计了解不多,最近我得到了一个承诺需要庞大数据库的项目,我对设计标准数据库结构(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等...)?
答案 0 :(得分:1)
简而言之:你不应该“合并”多个表。
即使它们恰好具有相同的字段,它们几乎肯定没有相同的约束(例如,从其他表指向它们的外键)。