【问题标题】:Ask mysql database design问mysql数据库设计
【发布时间】:2013-01-30 10:10:56
【问题描述】:

我是 mysql 的新手。我想询问有关数据库设计的问题,我会附上我的设计(对不起,我已经阻止发布图像)。所以我将键入数据库。你能告诉我哪个更好,以及原因。或者这种数据库有更好的设计。??

第一个设计:

tbl_member:
- id
- name

tbl_member_parent:
- id
- id_member
- parents_name

tbl_member_sibling:
- id
- id_member
- sibling_name

或第二个设计:

tbl_member:
- id
- name

tbl_relation_type:
- id
- relation:"parent","sibling" 

tbl_member_relation:
- id
- id_member
- id_relation_type
- name_value 

也许接下来,我会在 relation_type 中添加 (10-20) 行(比如朋友、邻居)。

我认为我应该使用第二个,但我不太确定.. 哈哈

对不起,如果我的英语不好..

非常感谢..


@inhan
ic2..是的,我也这么认为..
这是我的迷你数据库设计..

原文:

性别表
-  id INT auto_increment PK
- 性别变量:“男性”、“女性”

状态表:
- id INT auto_increment PK
- 状态 varchar :"active","notActive","problem"

权限表:
- id INT 自动递增 PK
- 特权 varchar:"manager","moderator","member"

国家表:
- id INT auto_increment PK
- 国家 varchar

城市表:
- id INT auto_increment PK
- 城市 varchar
- id_country INT、FK(到国家/地区 table.id)

工作表:
- id INT auto_increment PK
- 作业 varchar

成员表:
- id INT auto_increment PK
- 成员名称 varchar
- 生日日期
- id_sex INT、FK(到 sex table.id)
- id_status INT,FK(到状态表.id)
- id_privilige INT、FK(到权限表.id)
- 地址 varchar
- id_city INT、FK(到 city table.id)

因为,人们可以有多个昵称、兄弟姐妹、朋友、工作、国籍等

memberJob 表:
-  id INT auto_increment PK
-  id_member INT、FK(到成员 table.id)
-  id_job INT、FK(到作业表.id)

成员国籍表:
-  id INT auto_increment PK
-  id_member INT、FK(到成员 table.id)
- id_country INT、FK(到国家/地区 table.id)

然后制作memberNickname表; memberSiblings 表; memberFriends 表等

我想更改 memberJob 的表格设计;成员国籍;成员兄弟姐妹;会员朋友


我认为是这样的:

关系表
- id INT auto_increment PK
- 关系类型 varchar : "siblings", "freinds", "job", "nationality",

会员详情
- id INT auto_increment PK
- id_member INT、FK(到成员 table.id)
- id_relation INT、FK(到关系 table.id)
- id_value INT, FK(如果 id_relation: 兄弟和朋友然后 id_value FK 到成员 table.id ; 如果 id_relation:job 那么 id_value FK 到工作 table.id; 如果 id_relation:nationality 那么 id_value FK 到国家 table.id)

成员昵称
- id INT PK auto_increment
-  id_member INT FK(到成员 table.id)
- 昵称 varchar

这有什么问题吗?

【问题讨论】:

    标签: mysql database


    【解决方案1】:

    具有以下列的单个表 members 就可以了。

    • idINT auto_increment PK
    • name
    • parent_idINT 默认 NULL,FK(到 id

    因此,当您查询时,您需要做的就是使用同一张表进行联接。那些没有parent_id 的人将是最高级别的成员,而其他人将是孩子。要找到兄弟姐妹,您需要做的就是找到指向同一个父节点的子节点。

    [编辑 1]

    如果您想拥有其他类型的关系,那么您可以创建另外 2 个表并忽略上表中的 parent_id 列。

    relationshipTypes

    • idINT auto_increment PK
    • rel_name

    relationships 表:

    • id智力PK
    • user_id INT、FK(至 members.id
    • rel_type_id INT、FK(至 relationshipTypes.id

    因此您可以从members 中选择用户,然后在relationships 中找到所有匹配的记录,并将其与relationshipTypes 连接起来,这样您就拥有了所有信息。

    [对 OP 的评论]

    以下言论是我个人的想法。

    1. 您的sexstatusprivilege 表是不必要的,因为每个成员只能有 1 个性别(性别)、1 个身份和 1 个特权,所有这些都可以枚举(ENUM,从技术上讲)在member 表中。
    2. 另外,我会忘记多个国籍,让用户选择 1 个国籍。所以这些数据也可以移动到member 表中。
    3. 我将再次将city 数据保留在member 表中(作为VARCHAR),同时为countrycountry 表保留一个FK。此信息的机会可能很大,因此看起来不可行。对于您的系统,如果您想专注于特定国家(目标市场),那么您可以有一个包含该国家城市列表的枚举列,加上一个“其他”选项并为该“其他”城市创建一个附加列,可以是数据类型VARCHAR
    4. 处理工作由您决定。我不知道你希望你的视觉形式是什么样的。

    【讨论】:

    • 嘿,太好了..我选择做“二次设计”的原因是为了减少表的数量..因为我已经做了数据库设计,它包含70个表..和我觉得太多了,因为在某些表中只包含 2-6 行(成为另一个表的外键).. 表的数量会影响性能吗?还是性能取决于行数??
    • @derpelp 这取决于很多事情,因此无法给出明确的答案。但是上面的结构就是所有的 - 所有用户只有 3 个表,仅此而已。否则,创建这么多表实际上可以一起存储在一个或几个表中对我来说听起来不是一个好的数据库设计。
    • hey inhan.. 你能再回顾一下我的数据库吗.. 我会添加有问题的数据库设计.. 谢谢你..
    猜你喜欢
    • 2012-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-08
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多