2010-12-11 50 views
0

J'ai une base de données avec des dizaines d'entités différentes et j'ai besoin d'une manière flexible de représenter les références entre entités sans créer de tables N * M many-to-many ou ajouter beaucoup de colonnes de clés étrangères. Une option que je considérais était de créer une paire de colonnes pour représenter une référence, ref_type (string/varchar) et ref_id (int), et les utiliser dans un style EAV pour pointer vers une autre entité. Le type ref_type contiendrait le nom de l'entité référencée et le ref_id contiendrait l'identifiant de l'entité (comme une clé étrangère).Clé étrangère variable de type EAV ref_type/ref_id: mauvaise conception?

Par exemple, si j'avais table pour mon entité Foo et je voulais faire référence à des entités Bar ou Baz, il pourrait ressembler à ceci:

foo_id foo_name ref_type ref_id 
------ -------- -------- ------ 
1  aaa  bar  352 
2  bbb  baz  937 
3  ccc  bar  522 

Je connais les moyens plus traditionnels pour y parvenir serait d'avoir un bar_id et un baz_id en tant que colonnes de clé étrangère dédiée dans ma table foo, ou pour avoir des tables dédiées foo_to_baz et foo_to_bar qui pourraient représenter les relations. Avec seulement deux entités référencées possibles, ces options normales ne sont pas trop mauvaises, mais si vous avez 20 ou 200 entités possibles, cela ne semble pas pratique.

Ce motif a-t-il un nom spécifique? Ou cela tombe-t-il sous Entity-Attribute-Value (EAV)?

Est-ce considéré comme "mauvaise" base de données? Si oui, existe-t-il une meilleure solution qui ne nécessite pas beaucoup de colonnes de clés étrangères ou de tables X_to_Y?

+0

Si vous avez 200 types distincts d'entités DB, vous êtes soit NASA ou votre conception globale est erronée, et ce petit détail est sans importance dans le grand schéma des choses. –

Répondre

4

Quel que soit le problème, si vous décidez de le résoudre avec EAV, vous avez maintenant deux problèmes.