AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 335763
Accepted
Md. A. Apu
Md. A. Apu
Asked: 2024-02-13 04:28:05 +0800 CST2024-02-13 04:28:05 +0800 CST 2024-02-13 04:28:05 +0800 CST

Precisa de ajuda no design de banco de dados para relações complexas de 5 entidades

  • 772

O que é isso

Tenha muitas histórias (com muitas falas em cada uma). Cada um traduzido em vários idiomas. Cada idioma tem muitos sotaques. Eu gostaria de oferecer ao usuário a escolha dos idiomas (pode escolher muitos dos quais abrangem todas as histórias) e depois escolher exatamente um sotaque de todos os sotaques de cada idioma.

Exemplo de dados

Suponha que temos 2 histórias, cada uma traduzida em 3 idiomas e cada idioma tem 5 sotaques (áudio vocal)

Requisito de acesso a dados

Agora pense que o usuário escolheu
o Idioma 2 com acento 1 e o Idioma 3 com acento 4

Agora o áudio será reproduzido como a seguir

  1. Story 1 > Line 1 from Language 2 of Accent 1 então Story 1 > Line 1 from Language 3 of Accent 4
  2. Story 1 > Line 2 from Language 2 of Accent 1 então `História 1> Linha 2 do Idioma 3 do Sotaque 4
  3. // continua até o final da história e então começa uma nova história e joga assim

Possíveis entidades/tabelas

  1. Histórias
  2. Linhas
  3. línguas
  4. Acentos
  5. Áudios

Obviamente eu inventei isso, preciso de ajuda aqui.

Onde a ajuda é necessária

Para cumprir o uso pretendido dos dados, como deveriam ser as tabelas, quais seriam as relações entre elas (como stories hasMany Languagescoisas assim).
E ...
Como posso consultar dados para oferecer ao usuário sobre a 1ª seleção na seção "O que é" no topo.

Sobre mim: tenho experiência em desenvolvimento de software, mas não tanto em design de esquemas complexos. Eu (acho) posso lidar com coisas de banco de dados bastante complexas, mas obviamente não isso.

Info: estou fazendo em MySQL (MariaDB)

mysql
  • 2 2 respostas
  • 76 Views

2 respostas

  • Voted
  1. Rick James
    2024-02-14T01:45:48+08:002024-02-14T01:45:48+08:00

    Na minha opinião, sua tarefa é simples o suficiente para escrever código que funcione 'identicamente' tanto no MariaDB quanto no MySQL.

    Há duas “coisas” em que pensar:

    • Entidade - Implemente como uma tabela com informações sobre vários tipos de coisas (por exemplo, Stories)
    • Relações - Implementar via FORIGN KEYse JOINs. E possivelmente através de uma tabela de mapeamento "muitos para muitos".

    Deixe-me discutir três padrões de esquema:

    • um para muitos - Onde a tabela "muitos" possui um ID vinculado à tabela "um".
    • muitos para muitos - Onde há uma tabela extra que possui dois IDs vinculados a cada uma das duas tabelas.
    • tabela de "mapeamento" ou "normalização" - Esta é uma tabela cujo objetivo principal é mapear entre uma string curta ide uma string mais longa.
    • (Estou deixando de fora um para um porque eles geralmente deveriam ser mesclados em uma única tabela.)

    Deixe-me dar o seu exemplo, stories hasMany Languagesonde a tabela Storiescontém informações gerais sobre histórias. (Esta é uma "Entidade".)

    Outra tabela, Stories_Languages, possui story_iduma coluna ( lang_id) com "en_US", "en_GB", "fr_FR", "fr_CA, etc. (Este é um "Relacionamento".)

    Se isso é tudo que você precisa para idioma/sotaque, então Storiesé uma tabela simples "um para muitos" e Stories_Languagesuma tabela de mapeamento simples.

    No entanto, se houver muitos detalhes sobre o idioma, você precisará de uma tabela de entidades separada Languagese Stories_Languagesse tornará uma tabela "muitos para muitos" completa.

    • 1
  2. Best Answer
    Giannis Tsimarakis
    2024-02-17T17:04:30+08:002024-02-17T17:04:30+08:00

    Olhando para o seu diagrama, acho que sua dificuldade começa onde você erroneamente tenta modelar "Línguas" como subordinadas de "Linhas", quando na verdade é uma entidade independente. Além disso, o resto do modelo parece bom no nível conceitual.

    Levando em consideração as chaves, existe o problema comum de colocar uma coluna Id como chave primária em todos os lugares. Pelo menos você não usou outro id para “Áudios”.

    Depois de corrigir o primeiro problema e tentar um uso mais lógico de substitutos para compor chaves relacionais, acho que você pode usar um modelo semelhante a este:

    insira a descrição da imagem aqui

    Para sua próxima pergunta, não tenho certeza do que você está tentando consultar, mas será bastante fácil. Por exemplo, você pode usar algo assim para obter o progresso da narração de uma história em um sotaque de idioma específico:

    CREATE VIEW Narration_V
    AS
    SELECT Story.Name          AS Story,
           Language.Name       AS Language,
           LanguageAccent.Name AS Accent,
           (
               SELECT COUNT(*)
               FROM StoryLineRecording
               WHERE StoryNo = Story.StoryNo
                 AND LanguageCode = LanguageAccent.LanguageCode
                 AND AccentNo = LanguageAccent.AccentNo
           ) * 1.0 /
           (
               SELECT COUNT(*)
               FROM StoryLine
               WHERE StoryNo = Story.StoryNo
           ) AS Progress
    FROM Language
    INNER JOIN LanguageAccent
    ON Language.LanguageCode = LanguageAccent.LanguageCode
    CROSS JOIN Story;
    
    

    Depois de uma segunda leitura, acho que entendi melhor os requisitos da sua consulta. Para obter uma lista dos sotaques em que cada história é totalmente narrada, você pode usar algo assim:

    SELECT Language.Name AS Language, LanguageAccent.Name AS Accent
    FROM Language
    INNER JOIN LanguageAccent
    ON Language.LanguageCode = LanguageAccent.LanguageCode
    WHERE NOT EXISTS
              (
                  SELECT 1
                  FROM Story
                  WHERE EXISTS
                            (
                                SELECT 1
                                FROM StoryLine
                                WHERE StoryNo = Story.StoryNo
                                  AND NOT EXISTS
                                    (
                                        SELECT 1
                                        FROM StoryLineRecording
                                        WHERE StoryNo = Story.StoryNo
                                          AND [LineNo] = StoryLine.[LineNo]
                                          AND LanguageCode = LanguageAccent.LanguageCode
                                          AND AccentNo = LanguageAccent.AccentNo
                                    )
                            )
              );
    

    Este é o melhor que posso encontrar agora, mas pode haver uma solução mais simples.

    • 1

relate perguntas

  • Existem ferramentas de benchmarking do MySQL? [fechado]

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

  • Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?

  • Como um grupo pode rastrear alterações no esquema do banco de dados?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve