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 / user-105977

user5613506's questions

Martin Hope
user5613506
Asked: 2017-11-08 12:25:43 +0800 CST

Internacionalização de um supertipo-subtipo

  • 2

Em primeiro lugar, peço desculpas por vincular esta pergunta a outra, mas essa foi a melhor maneira que pude pensar para mantê-la simples e focada

Meses atrás fui apresentado ao supertipo-subtipo como solução para um problema que era mais ou menos fácil de apresentar mas não estava conseguindo resolver

Eu entendi o conceito básico e consegui fazê-lo funcionar com meu modesto conhecimento e funcionou muito bem, considerando que a pergunta original tem mais de um ano.

Porém hoje me deparei com um problema que não consegui resolver: Internacionalização

Até agora eu tinha uma tabela nomeada i18ncom uma FOREIGN KEY apontando para a PRIMARY KEY da tabela do supertipo ( Items) assim como todos os subtipos ( Car, Boate Plane) e ao consultar, entre todas as colunas de todos os subtipos, incluo a coluna nesta tabela de internacionalização com as strings traduzidas juntando tudo pela chave do supertipo.

Algo assim:

Itemsestrutura:

+----+---------------------+---------------------+
| PK | Common Attribute #1 | Common Attribute #2 |
+----+---------------------+---------------------+

Carestrutura:

+----+-----------+--------------+--------------+
| PK | Reference | Attribute #1 | Attribute #2 |
+----+-----------+--------------+--------------+

Boatestrutura:

+----+-----------+--------------+--------------+--------------+
| PK | Reference | Attribute #1 | Attribute #2 | Attribute #3 |
+----+-----------+--------------+--------------+--------------+

Planeestrutura:

+----+-----------+--------------+--------------+--------------+--------------+
| PK | Reference | Attribute #1 | Attribute #2 | Attribute #3 | Attribute #4 |
+----+-----------+--------------+--------------+--------------+--------------+

i18nestrutura:

+----+-----------+------+
| PK | Reference | Text |
+----+-----------+------+

Referenceé a CHAVE ESTRANGEIRA

Não tenho certeza se essa é a melhor abordagem, mas funciona porque até agora apenas uma das colunas tinha texto passivo de internacionalização — digamos Attribute #1. No entanto, hoje, notei que um dos subtipos precisaria de duas colunas para ser traduzido e o jeito que eu estava fazendo era considerar apenas uma — digamos Attribute #4de PlanesTable.

Eu gostaria de fazer isso diretamente no nível do banco de dados, em vez de ter alguma palavra-chave representativa para substituir a linguagem do lado do servidor.

Tentei fazer uma subconsulta para que essa segunda coluna fosse traduzida mas, além de não funcionar, isso estava me cheirando mal.

Como eu poderia fazer isso?

[EDITAR]

Achei melhor postar minha última tentativa:

SELECT 
    `items`.`cid` AS `id`, `items`.`reference`, `items`.`GUID`,     # That's Users' Items Table

    `core`.`image`, `core`.`type`, `core`.`class` AS `classname`,   # That's the supertype

    `cars`.`attribute1`, `cars`.`attribute2`,

    `boats`.`attribute1`, `boats`.`attribute2`, `boats`.`attribute3`,

    `planes`.`attribute1`, `planes`.`attribute2`, `planes`.`attribute3`, `planes`.`attribute4`,

FROM `items`
    LEFT OUTER JOIN core ON( ( items.reference = core.iid ) )
        LEFT OUTER JOIN `catalog`.`cars` cars ON( items.reference = cars.reference )
            LEFT OUTER JOIN `catalog`.`boats` boats ON( items.reference = boats.reference OR items.reference = boats.attribute3 )
                LEFT OUTER JOIN `catalog`.`planes` planes ON( items.reference = planes.reference )
                    LEFT OUTER JOIN users ON( items.UserId = users.id )
                        LEFT OUTER JOIN i18n ON( items.reference = i18n.reference )

WHERE `i18n`.`langCode` = 'en'
        AND ( `items`.`GUID` = '4cca0b05-84b0-40af-8808-2379b32df35f' OR `items`.`GUID` = '41a0917e-8ccf-43a3-b52a-0ae0a09a2374' )

ORDER BY ( FIELD( `items`.`GUID`, '4cca0b05-84b0-40af-8808-2379b32df35f','41a0917e-8ccf-43a3-b52a-0ae0a09a2374' ) )

Para este exemplo, usei o subtipo Boatspara demonstrar a outra coluna que poderia/deveria ser traduzida.

Posso recuperar todos os dados necessários de todos os subtipos de uma só vez com esta consulta. Ele terá várias colunas, NULLmas ao buscar dados, com PHP ( PDO::FETCH_NAMED, para o que importa) tudo funciona.

Mas não estou conseguindo retornar a coluna com o texto ( i18n.text), apenas seu Reference ID que corresponde ao supertipo Table ( Items.reference).

Eu sei, eu sei, não estou incluindo isso como uma coluna a ser recuperada, mas, se o fizer, a primeira coluna traduzível ( ) funciona, mas attribute1qualquer outra, que qualquer subtipo possa ter (aqui boats.attribute3) duplica o valor de atribute1de puxar seu próprio valor referenciado.

mysql database-design
  • 2 respostas
  • 241 Views
Martin Hope
user5613506
Asked: 2016-09-17 07:38:28 +0800 CST

Como modelar um tipo de entidade que pode ter diferentes conjuntos de atributos?

  • 15

Estou tendo problemas para recriar um banco de dados com um relacionamento um-para-muitos (1:M) entre Users e Items .

Isso é bastante direto, sim; no entanto, cada Item pertence a uma determinada Categoria (por exemplo, um Carro , um Barco ou um Avião ), e cada Categoria possui um determinado número de atributos, por exemplo:

Carestrutura:

+----+--------------+--------------+
| PK | Attribute #1 | Attribute #2 |
+----+--------------+--------------+

Boatestrutura:

+----+--------------+--------------+--------------+
| PK | Attribute #1 | Attribute #2 | Attribute #3 |
+----+--------------+--------------+--------------+

Planeestrutura:

+----+--------------+--------------+--------------+--------------+
| PK | Attribute #1 | Attribute #2 | Attribute #3 | Attribute #4 |
+----+--------------+--------------+--------------+--------------+

Devido a essa diversidade na quantidade de atributos (colunas), inicialmente pensei que seria uma boa ideia criar uma tabela separada para cada Category , assim evitaria vários NULLs e assim aproveitaria melhor a indexação.

Embora parecesse ótimo no começo, não consegui encontrar uma maneira de criar o relacionamento entre os itens e as categorias através do banco de dados porque, pelo menos em minha modesta experiência como administrador de banco de dados, ao criar chaves estrangeiras, informo explicitamente um banco de dados o nome da tabela e a coluna.

No final, gostaria de uma estrutura sólida para armazenar todos os dados, mas com todos os meios para listar todos os atributos de todos os itens que um usuário possa ter com uma consulta.

Eu poderia codificar consultas dinâmicas com a linguagem do lado do servidor , mas acho que isso está errado e não é o ideal.

Informação adicional

Estas são minhas respostas aos comentários do MDCCL:

1. Quantas categorias de itens de interesse existem em seu contexto de negócios, três (ou seja, carros , barcos e aviões ) ou mais?

Na verdade, é muito simples: existem apenas cinco categorias no total.

2. O mesmo Item pertencerá sempre ao mesmo Utilizador (ou seja, uma vez que um determinado Item tenha sido “atribuído” a um determinado Utilizador não pode ser alterado)?

Não, eles podem mudar. No cenário fictício da pergunta, seria como se o usuário A vendesse o item nº 1 para o usuário B , portanto, a propriedade deve ser refletida.

3. Existem atributos compartilhados por algumas ou todas as categorias ?

Não compartilhado, mas, de memória, posso dizer que pelo menos três atributos estão presentes em todas as Categorias .

4. Existe uma chance de que a cardinalidade do relacionamento entre Usuário e Item seja muitos-para-muitos (M:N) em vez de um-para-muitos (1:M)? Por exemplo, no caso das seguintes regras de negócios: A User owns zero-one-or-many ItemseAn Item is owned by one-to-many Users

Não, porque Itens descreveriam um objeto físico. Os usuários terão uma cópia virtual deles, cada um identificado por um GUID v4 exclusivo

5. Em relação à sua seguinte resposta a um dos comentários da pergunta:

“No cenário fictício da pergunta, seria como se o usuário A vendesse o item nº 1 para o usuário B , então a propriedade deve ser refletida.”

Parece que você está planejando acompanhar a evolução da propriedade do item , por assim dizer. Desta forma, quais atributos você gostaria de armazenar sobre tal fenômeno? Apenas a modificação do atributo que indica o Usuário específico que é o Dono de um Item específico ?

Não, na verdade não. A propriedade pode mudar, mas não preciso acompanhar o proprietário anterior .

mysql database-design
  • 2 respostas
  • 11797 Views

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