【问题标题】:Profile Page Use Case个人资料页面用例
【发布时间】:2013-03-03 14:33:47
【问题描述】:

网站的个人资料页面包含任何用户的这些类型的字段-

  1. 一对一字段 - 姓名、年龄、性别
  2. 一对多领域 - 工作经历、教育
  3. 多对多领域 - 语言、奖项、委员会

工具 - MYSQL 和 PHP [但可以更改]

我决定创建一个用户表。

tbl_user -> PK - user_id , FK - profile_id 

对于用户一次出现的所有字段,我将它们作为属性添加到表 tbl_user_profile。

tbl_user_profile -> PK - profile_id 

然后,为了满足一对多的关系,我创建了一堆表 - 这很容易随着时间的推移而增长..

tbl_user_jobs , tbl_user_education
FK - user_id [ INNO DB ]

然后我创建了一堆表作为 MANY_TO_MANY 建模的参考表 -

tbl_ref_awards, tbl_ref_languages, tbl_ref_committee
PK = REF_ID

tbl_user_languages, tbl_user_awards, tbl_user_committee
FK - user_id , REF_ID

现在,我必须使用刚才提到的许多细节来呈现个人资料页面。在每次页面加载时,我必须将表 tbl_user_* 表与 tbl_user 连接起来并填充到页面中。

我首先猜测这个设计是否可以?其次,在 page 上加入了 [7 次] 一样多的表,我在页面加载中看到了拖累,并且很高兴听到在上述用例中数据库设计的可能改进。已经有索引和 FK 存在。尚未在任何地方添加缓存。

【问题讨论】:

    标签: php sql social-networking entity-relationship


    【解决方案1】:

    这是一种相当合理的数据建模方法;我要做的唯一评论是,我没有将参考表的主键命名为“REF_ID”,而是在表本身之后命名它们 - 例如,award_id。外键同上。

    当然,这是一个偏好问题,但它更加一致 - 您已将用户配置文件表的主键命名为“profile_id”。

    在现代硬件上,通过适当的索引,7 表连接不应该是性能问题,除非您要处理数亿条记录。请发布慢查询的解释,让我们看看我们是否可以提供帮助。

    但是,实际上,运行几个小查询来填充页面可能比一个大查询更容易。这是因为 7 表连接当然会为每一行重复所有“一对一”数据,这只会创建一些混乱的数据处理层。我现在在想象,你得到了

    user_id user_name job_name language_name
    -------------------------------------------
    1      Bob         Waiter   French
    1      Bob         Waiter   German
    1      Bob         Waiter   Italian
    1      Bob         Plumber  French
    1      Bob         Plumber  German
    1      Bob         Plumber  Italian
    

    相反,我会在一个查询中检索用户个人资料,在第二个查询中检索用户工作,在第三个查询中检索用户教育,依此类推。这使您的 PHP 代码更加整洁,并减少了您在数据库和 Web 应用程序之间移动的数据量。

    【讨论】:

    • 感谢 Neville,我会考虑到这一点并将它们分开。如果我看到性能仍然下降,将在论坛上发布计划以解决慢速查询。
    猜你喜欢
    • 2014-10-09
    • 2015-10-08
    • 1970-01-01
    • 2020-01-23
    • 1970-01-01
    • 2016-11-26
    • 2015-08-02
    • 1970-01-01
    • 2014-01-29
    相关资源
    最近更新 更多