2010-05-30 4 views
0

J'ai le schéma suivant implémenté avec succès dans mon application. L'application connecte les canaux d'unité de bureau aux canaux d'unité d'E/S. Les tables DeskUnits et IOUnits sont essentiellement une liste d'unités de bureau/E/S et le nombre de canaux sur chacune. Par exemple, un bureau pourrait être 4 ou 12 canaux.Implémentation d'une relation 1 à plusieurs avec SQLite

CREATE TABLE DeskUnits (Name TEXT, NumChannels NUMERIC); 
CREATE TABLE IOUnits (Name TEXT, NumChannels NUMERIC); 

CREATE TABLE RoutingTable (DeskUnitName TEXT, DeskUnitChannel NUMERIC, IOUnitName TEXT, IOUnitChannel NUMERIC); 

'table' Le RoutingTable relie ensuite chaque canal de DeskUnit à un canal Iounit. Par exemple, le DeskUnit appelé "Desk1" canal 1 peut acheminer vers le nom IOunit "IOUnit1" canal 2, etc.

Jusqu'ici j'espère que c'est assez simple et compréhensible. Le problème est, cependant, c'est une relation strictement 1 à 1. Tout canal DeskUnit peut acheminer vers un seul canal IOUnit.

Maintenant, j'ai besoin d'implémenter une relation de 1 à plusieurs. Où n'importe quel canal DeskUnit peut se connecter à plusieurs canaux IOUnit. Je me rends compte que je pourrais avoir à réorganiser les tables complètement, mais je ne suis pas sûr de la meilleure façon d'y parvenir. Je suis assez nouveau pour SQLite et les bases de données en général, donc toute aide serait appréciée.

Merci

Patrick

Répondre

3

Votre RoutingTable est une implentation typique d'une relation plusieurs-à-plusieurs. Par exemple:

DeskUnitName DeskUnitChannel IOUnitName IOUnitChannel 
A    1     A   1 
A    2     A   1 
B    1     A   1 
B    1     A   2 

Ce relierait trois DeskUnitChannels à un IOUnitChannel (A1), et deux IOUnitChannels à un DeskUnits (B1).

Une solution plus normalisée ressemblerait à ceci:

DeskUnit   DeskUnitId, Name, NumChannels 
DeskUnitChannel DeskUnitChannelId, DeskUnitId, Channel 
IOUnit   IoUnitId, Name, NumChannels 
IOUnitChannel IoUnitChannelId, IoUnitId, Channel, DeskUnitChannelId 

Cette approche n'a pas beaucoup à plusieurs relations. Mais il a trois un à plusieurs relations:

  • une unité de bureau a zéro ou plusieurs canaux unitaires bureau
  • une unité IO a zéro ou plusieurs canaux d'unité IO
  • un canal de l'unité de bureau peut avoir zéro ou plusieurs canaux d'unités d'E/S

Les relations plusieurs-à-plusieurs ont tendance à ajouter beaucoup de complexité à une application. J'essaie de les éviter à moins qu'ils ne soient vraiment nécessaires.

+0

Merci beaucoup pour la réponse, ça aide vraiment. Mais comment est-ce que j'écrirais une instruction sql pour montrer tous les IOUnits sur un canal de DeskUnit particulier? – Patrick

+0

@Patrick: Pour DeskUnitChannel 3, essayez 'select * de IOUnit iu joint interne IOUnitChannel iuc sur iu.IoUnitId = iuc.IoUnitId où iuc.DeskUnitChannelId = 3' – Andomar

1

En fait, vous avez déjà 1 à many parce que les champs ne sont pas les clés et/ou ne sont pas déclarés comme unique.

Vous pouvez donc ajouter plusieurs enregistrements dans RoutingTable avec les mêmes valeurs DeskUnitName et DeskUnitChannel.

+0

Je vous ai dit que j'étais nouveau à ce sujet :-). Merci pour la réponse et me mettre directement. – Patrick

Questions connexes