Relacionamento com o criador e dono da base de dados MySQL? Por exemplo, o utilizador & multimédia?

Qual é a melhor maneira de unir duas tabelas se há uma relação de criador e dono entre elas? Por exemplo, um usuário cria um arquivo de mídia. Um usuário opcionalmente tem um arquivo de imagem / mídia como uma imagem de perfil. Construí um esquema com a bancada de trabalho MySQL. Mas assim não funciona. As outras tabelas: um projeto tem um ou muitos bugs, Um bug tem um ou muitos comentários. Ambos os bugs um comentário pode ter um ou muitos arquivos de imagens / mídia. Obrigado!

Mysql workbench wrong database schema

Author: Mike, 2018-02-02

1 answers

Primeiro::
Com base na sua explicação, o seu desenho de Base de Dados deverá ser assim (notação UML):

enter image description here

Um utilizador cria um ficheiro multimédia.

Então você tem um creator_user_id Como F. K em media. Ele não pode ser null e cada mídia deve ter um criador.

Um utilizador opcionalmente tem um ficheiro imagem / media como uma imagem de perfil.

Então tens uma relação de um para um. entre Usuário e mídia. Tem duas opções:
  1. mover o id do utilizador como F. K para os media como profile_user_id e torná-lo Allow NULL e Unique.
  2. mover o ID do disco como F. K para o utilizador como profile_media_id e torná-lo Allow NULL e Unique.
Ambos estão correctos.

Por exemplo (segunda opção), você pode ter um profile_media_id Como F. K em user. Pode ser . mas deve ser unique. Significa que um media só pode aparecer num perfil de utilizador.

Este desenho (segundo opção) não está errado. Parece uma referência circular. Mas, quando você está adicionando um novo usuário com uma imagem de perfil( ao mesmo tempo), você deve realizar estas ações em uma transação :

  1. crie um utilizador (e deixe o profile_media_id Ser null)
  2. criar um meio com um novo creator_user_id
  3. actualizar o novo utilizador profile_media_id


em Segundo lugar,:
Sua segunda parte do design (relacionamentos entre mídia e post e bug) parece bem. (com base nas suas explicações)

No entanto, ofereço-lhes a criação de um sistema de gestão de meios de comunicação externo para eles (veja a minha resposta aqui).

Editar

Você pode usar algo como abaixo para criar suas tabelas:

SET FOREIGN_KEY_CHECKS=0; 
DROP TABLE IF EXISTS myuser;
SET FOREIGN_KEY_CHECKS=1;

CREATE TABLE myuser(
    user_id INT NOT NULL,
    profile_media_id INT DEFAULT NULL,
    PRIMARY KEY (user_id)
);

DROP TABLE IF EXISTS mymedia;
CREATE TABLE mymedia(
    media_id INT NOT NULL,
    creator_user_id INT NOT NULL,
    PRIMARY KEY (media_id),
    FOREIGN KEY (creator_user_id) REFERENCES myuser (user_id),
    UNIQUE (creator_user_id)
);

ALTER TABLE myuser ADD CONSTRAINT myusermymediafk FOREIGN KEY (profile_media_id) REFERENCES mymedia (media_id);

VerO teste de MySQL aqui .

 1
Author: Gholamali-Irani, 2018-02-03 08:08:35