【问题标题】:Object storage in mysqlmysql中的对象存储
【发布时间】:2023-03-28 21:17:01
【问题描述】:

我正在设计一个数据库,求职者必须列出他们以前的工作经验。

工作经验是一类具有:

  • 雇主
  • 担任的职务

我想为这些课程建模并展示求职者与他们以前的工作经历之间的联系。

我正在考虑为以前的工作经验创建一个表格并将其引用给求职者,但每个求职者可以有多个工作经验条目,这可能会变得混乱。

另一种方法是将用户的所有工作经验作为一个列表存储在求职者表中。

我不知道该选择哪一个,我想就哪些可以接受,哪些不可以接受一些建议。任何其他替代方案都是受欢迎的,实际上是要求的。谢谢

【问题讨论】:

    标签: mysql sql list object database-design


    【解决方案1】:

    我会选择这样的设置。

    这将保存所有用户过去的经验

    CREATE TABLE `positions` (
      `position_id` int(11) NOT NULL AUTO_INCREMENT,
      `position_name` varchar(50) DEFAULT NULL,
      PRIMARY KEY (`position_id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1
    

    这将保存用户的个人数据

    CREATE TABLE `users` (
      `user_id` int(11) NOT NULL AUTO_INCREMENT,
      `user_firstname` varchar(20) NOT NULL,
      `user_lastname` varchar(20) DEFAULT NULL,
      PRIMARY KEY (`user_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1
    

    这将保存用户的工作经验 - positionsusers 的“中间”表。

    CREATE TABLE `work_experience` (
      `seeker_id` int(11) NOT NULL AUTO_INCREMENT,
      `seeker_position` int(11) NOT NULL,
      `seeker_employer` varchar(20) NOT NULL,
      `seeker_user` int(11) NOT NULL,
      PRIMARY KEY (`seeker_id`),
      KEY `positon_id` (`seeker_position`),
      KEY `user_id` (`seeker_user`),
      CONSTRAINT `user_id` FOREIGN KEY (`seeker_user`) REFERENCES `users` (`user_id`),
      CONSTRAINT `positon_id` FOREIGN KEY (`seeker_position`) REFERENCES `positions` (`position_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1
    

    然后它的功能就像;

    SELECT users.* FROM users;
    +---------+----------------+---------------+
    | user_id | user_firstname | user_lastname |
    +---------+----------------+---------------+
    |       1 | bob            | bob           |
    +---------+----------------+---------------+
    1 row in set
    
    SELECT positions.* FROM positions;
    +-------------+-------------------+
    | position_id | position_name     |
    +-------------+-------------------+
    |           1 | stackoverflow guy |
    +-------------+-------------------+
    1 row in set
    
    SELECT work_experience.* FROM work_experience;
    +-----------+-----------------+-----------------+-------------+
    | seeker_id | seeker_position | seeker_employer | seeker_user |
    +-----------+-----------------+-----------------+-------------+
    |         1 |               1 | StackExchange   |           1 |
    +-----------+-----------------+-----------------+-------------+
    1 row in set
    

    用户“1”(bob)曾在“StackExchange”担任“stackoverflow 人”的工作经验

    • work_experience.seeker_user 引用 users.user_id
    • work_experience.seeker_position 引用 positions.position_id

    【讨论】:

    • 我喜欢这个设计。即使职位将由系统用户自己指定,您认为这是否适合?这些不是固定的。另外我想知道,如果用户添加了另一个职位,我们现在如何将其添加到他的体验中。
    • 是的。位置表的原因是您不会两次存储相同的数据。例如“系统管理”和“系统管理员”是一样的;但他们会占用 2 个条目。我会允许用户指定位置,但给他们一个当前存储位置的列表,这些位置与他们尝试输入的位置相似。
    • 我明白了。但是假设我们知道每个求职者都有一个独特的,我们现在是否只是摆脱职位表并将职位作为一个字段放在 work_experience 表中,基本上以@peter-m 建议的结构结束?
    • 你可以,但是你的表不会被规范化,因为你有“系统管理”和“系统管理员”,甚至有多个“系统管理员”条目"。
    【解决方案2】:

    您最初的想法是处理这种“多对一”情况的常用方法。

    使用一个表存储求职者,另一个存储以前的工作经验,每个 PWE 都有一个求职者的外键。 (例如“jobseekerId”字段。)

    【讨论】:

    • 感谢您的回复。我也在想有没有办法将求职者的整个工作历史记录在一个记录中?这样所有以前的位置都在此记录中表示。或者这种一对多表示是最好的方式吗?
    • 嗯,您可以以某种方式将所有这些信息序列化(例如 JSON)到 jobseeker 表中的一个 varchar 字段中......但本质上,数据库表是信息列表。因此,任何列表(尤其是可变长度列表)都最适合其自己的表。因此,您可以通过两种方式解决问题,但使用两个表更适合数据库为您提供的结构。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-11
    • 1970-01-01
    • 2011-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-15
    相关资源
    最近更新 更多