【问题标题】:How can I make ids for new table and insert genres_id and genres (2038 records) in a new table in data warehouse using PLSQL如何使用 PLSQL 为新表创建 id 并在数据仓库的新表中插入genres_id 和genres(2038 条记录)
【发布时间】:2021-02-04 07:34:00
【问题描述】:

我有 1 个表 movies来自 csv 文件。我需要使用附加表创建数据仓库genresproduction_companiesdirectors

首先,我想创建一个新表genres,它将有 2083 条记录。 如果我使用sequence_name.nextval(),我将有重复,因为我在movies 表中有 10856 部电影。

我还需要在dw_movies 表中只有genres_id,而不是genres_name

请给我你的建议。 这是movies 表:

CREATE TABLE "AS6400U"."MOVIES" (   
        "ID" NUMBER(38,0), 
        "IMDB_ID" VARCHAR2(26 BYTE), 
        "POPULARITY" NUMBER(38,6), 
        "BUDGET" NUMBER(38,0), 
        "REVENUE" NUMBER(38,0), 
        "ORIGINAL_TITLE" VARCHAR2(500 BYTE), 
        "CAST" VARCHAR2(500 BYTE), 
        "HOMEPAGE" VARCHAR2(300 BYTE), 
        "DIRECTOR" VARCHAR2(600 BYTE), 
        "TAGLINE" VARCHAR2(400 BYTE), 
        "KEYWORDS" VARCHAR2(500 BYTE), 
        "OVERVIEW" VARCHAR2(2000 BYTE), 
        "RUNTIME" NUMBER(38,0), 
        "GENRES" VARCHAR2(400 BYTE), 
        "PRODUCTION_COMPANIES" VARCHAR2(500 BYTE), 
        "RELEASE_DATE" DATE, 
        "VOTE_COUNT" NUMBER(38,0), 
        "VOTE_AVERAGE" NUMBER(38,1), 
        "RELEASE_YEAR" NUMBER(38,0), 
        "BUDGET_ADJ" NUMBER(38,3), 
        "REVENUE_ADJ" NUMBER(38,5)
       )

亲切的问候, 安娜

【问题讨论】:

    标签: oracle database-design data-modeling data-warehouse


    【解决方案1】:

    这是关于数据库建模的。表通常相互依赖,并且这种关系是通过外键约束来维护的。此外,表应该被规范化(最多为第 3 范式),这样您就不会将相同的数据存储两次(或更多次)。

    但是,数据仓库作用不同,因为它们处理大量数据,因此从几个巨大的表中获取行需要时间,因此 DW 表并不总是规范化的。

    说你的表有 10K 行——这对 Oracle 来说几乎没有,所以我认为你应该做我在第一段中提到的事情:首先规范化表,设置关系(外键引用的主键)。写下所有这些CREATE TABLE 声明,一个接一个,以确保你做对了。

    从序列下一个值开始:我会说你弄错了。通常,它的(序列)值是按升序排列的。当前表有 10K 行并不重要,您想创建一个有 2K 行的新表;所以呢? sequence.nextval 可能是 10K 左右(如果它也用于电影表)。您不应该(也可能不会)得到任何重复。

    【讨论】:

    • 感谢您的回答。帮助我进入正确的心情。我发现 nextval 可以这样使用:INSERT INTO dw_directors(director_id, director_name) SELECT directors_seq.NEXTVAL, m.director FROM (SELECT DISTINCT director FROM movies) m; 很好,很好用。新表中只有不同的记录。
    【解决方案2】:

    我会回应 @Littlefoot,对您的数据模型进行额外的观察。

    RELEASE_YEAR 38 位数字?真的吗?它应该是一个 DATE,具有月、日和时间组件的默认值。即使您想将其存储为 NUMBER(坏主意),为什么还需要 38 位呢?

    GENRES 根本不应该存在。一部电影可以有多种类型,所以应该在一个“链接”表中——一个表中的一列作为 FK 回到 MOVIES 的 PK,第二列作为 FK 回到 GENRES 表的 PK。

    其他一些列看起来可以使用相同的处理方法。尤其是 CAST 和 KEYWORD 和 PRODUCTION_COMPANIES。 (PRODUCTION_COMPANIES 是复数的事实是一个赠品)。

    所有这些 38 位数字! 38 位数的收入?制片人只能梦想一部电影的票房收入超过整个地球的国内生产总值。

    您可能将您的数据库视为“数据仓库”,这可能是因为它的使用模式是正确的(或者它可能不是——这个术语经常被非常松散地用于描述几乎任何数据库),但作为一个实用的不管它的大小只是昙花一现。您应该将所有表格设计为第三范式,并且只有在您发现确实需要此类处理的实际性能问题时才诉诸于“士气低落”。

    【讨论】:

    • 感谢您的评论。列的大小是近似的。我想快速加载,所以没有检查 Excel 中每一列的长度。我用它来解决我的问题:INSERT INTO dw_directors(director_id, director_name) SELECT directors_seq.NEXTVAL, m.director FROM (SELECT DISTINCT director FROM movies) m; 效果很好。
    • 是的,即使是director列也有名字很少的记录,我只需要给每个唯一的组合一个唯一的id。要使其标准化-->我不知道如何从记录中取出董事姓名并将它们放入中间表(您称之为“链接”)中,我可以将该表称为 directed_by 或类似的名称。然后会有带有director_id的表directors。和director_name。
    • 看起来你需要更多关于数据设计和数据规范化的指导,而不是这里可以涵盖的内容。 “链接”表用于“链接”两个具有多对多关系的表。通常他们不需要 2 列。对于每一行,1 列是“主”表(“电影”)之一的 FK,另一列是另一个“主”表(“导演”)的 FK。每行代表给定电影和给定导演之间的一种关系。
    • 我用过INSERT INTO dw_movies(movie_id, imdb_id, original_title, genres, popularity, budget, revenue, cast, homepage, director_id, tagline, keywords, overview, runtime, production_companies, release_date, vote_count, vote_average, release_year) SELECT m.id, m.imdb_id, m.original_title, m.genres, m.popularity, m.budget, m.revenue, m.cast, m.homepage, d.director_id, m.tagline, m.keywords, m.overview, m.runtime, m.production_companies, m.release_date, m.vote_count, m.vote_average, m.release_year FROM movies m INNER JOIN directors d ON m.director = d.director_name;
    • 但返回错误:ORA-01536: space quota exceeded for tablespace 'STUDENT1'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-16
    • 1970-01-01
    • 2012-04-16
    • 1970-01-01
    • 2019-11-02
    • 2014-01-01
    相关资源
    最近更新 更多