ISCO /国际标准职业分类的SQL表格设计

时间:2016-10-04 12:18:15

标签: mysql sql database-design

我试图弄清楚将国际标准职业分类插入MySQL的最佳方法是什么。

以下是有关类别的详细信息: http://www.ilo.org/wcmsp5/groups/public/---dgreports/---dcomm/---publ/documents/publication/wcms_172572.pdf

我还找到了一个github项目: https://github.com/patriciomacadden/isco/blob/master/db/schema.rb 它似乎每个不同级别的组使用单独的表。

我目前的意见是制作单个表并存储一些重复数据,因为数据不会经常更改,并且数据量少于千行。例如:

let navigationController = UINavigationController(rootViewController: viewController2())
        navigationController.navigationBar.backgroundColor = UIColor.clearColor()
        navigationController.navigationBar.tintColor = UIColor.clearColor()
        navigationController.navigationBar.translucent = true
        // customize according to your need

        self.presentViewController(navigationController, animated: true, completion: {

        })

'level'字段是varchar,因为我可能需要获取所有行,包括顶级类别。

  

WHERE level LIKE'511%'

我不确定将'level'作为int更好,但是在对这些特定数据进行排序时,varchar也可能具有更好的特性。

我不确定我是否需要单独使用l1,l2,l3,l4,但行数如此之少,也许并没有真正伤害到一些冗余。

所以,问题是,你在我的设计中看到任何明显的错误吗?你能改进吗?

我不确定是否需要提防更多字段,因为我还没有读完ISCO pdf ...

由于

2 个答案:

答案 0 :(得分:1)

我愿意

  • level VARCHAR(4) CHARACTER SET ascii。 (瞥一眼PDF似乎说4就足够了,但如果有必要,可以增加“4”。)VARCHAR将“正确”排序,INT不会。
  • SUBSTR(level, 3, 1)以获得相当于l3的内容,如果您需要显示这样的内容。
  • SUBSTR会为您提供一个空字符串,而不是NULL;您可以使用IF(,)CASE...以您喜欢的方式呈现它。

答案 1 :(得分:1)

你不需要l1 / l2 / l3 / l4和等级:这些都是完全多余的。以两种不同的方式存储相同的数据只会产生这样的可能性:沿线的某个地方出现错误会使它们不一致,然后你会得到奇怪的结果。使用l1 / 2/3/4的查询会查找与使用级别的查询不同的记录,并且用户感到困惑,为什么他们的结果没有意义。例如,如果数据输入屏幕使用级别并且您有代码将其分解为l1 / 2/3/4,则用户运行查询,该查询在表下使用l1 / 2/3/4并且它找到零匹配记录。然后他看着屏幕,记录就在那里!或者更糟糕的是,总数不会累加等等。

很难说两者中哪一个更喜欢。大多数查询可能更容易使用单个字段编写:选择等等等等等级=' 512'或选择等等等等等等等等等等等等等等等等等其中l1 = 5且l2 = 1且l3 = 2且l4为空等等。哦,测试较低级别而不参考更高级别可能毫无意义。也就是说,你什么时候会说选择blah blah l2 = 4但不测试l1?

级别肯定是一个字符串而不是整数。你想要' 51'在' 512'之前排序,而不是在之后排序。你永远不会对这些做算术,对吧?说chemist.level + teacher.level或者clerk.level * 3是什么意思?