Comment évitez-vous le nom de colonne de conflits?
J'ai récemment été affecté à une tâche de création d'un système d'enchères. Au cours de mon travail, j'ai rencontré de nombreuses occasions où mes requêtes SQL contenues rejoint échec de l'exécution en raison d'ambigu des noms de colonne. Considérez ceci (simplifié) structure de la table pour la vente aux enchères:
table auction
:
id
name
uid
(ID de l'utilisateur qui a créé la vente aux enchères)
table item
:
id
name
uid
(ID de l'utilisateur qui a ajouté à l'élément)aid
(ID de la vente aux enchères où l'article est disponible)price
(prix initial)
table user
:
id
name
table bid
:
id
uid
(ID de l'utilisateur qui a placé une enchère)iid
(article dont le prix a été revu à la hausse)price
(prix offert)
Comme vous pouvez le voir, il existe de nombreuses colonnes qui ont des noms en conflit. L'adhésion à ces tables nécessite l'utilisation de certains des mesures qui permettront d'effacer les ambiguïtés.
Je pense à deux façons de le faire. La première est de renommer les colonnes, en préfixant le tout avec une présentation abrégée de nom de table, ainsi que l'IDENTIFIANT de l'enchère va devenir a_id
, l'ID de l'élément deviendra i_id
, et l'ID de l'élément à l'intérieur de la bid
table deviendra b_i_id
. C'est assez solide, mais réduit la lisibilité des noms de colonne.
Un autre moyen que je peux penser à est de l'écriture explicite des requêtes:
SELECT `bid`.`id`, `user`.`name`, `bid`.`price`
FROM `bid`
JOIN `item` ON `item`.`id` = `bid`.`iid`
JOIN `user` ON `user`.`id` = `bid`.`uid`
JOIN `auction` ON `auction`.`id` = `item`.`aid`
WHERE `bid`.`price` > `item`.`price`
AND `auction`.`id` = 1
GROUP BY `user`.`id`
ORDER BY `bid`.`price` DESC;
C'est lisible et non équivoque, mais nécessite beaucoup plus de touches.
- Je utiliser la deuxième méthode, mais peut-être qu'il en existe d'autres que vous avez utilisé avec succès dans des situations similaires? Comment évitez-vous le nom de colonne de conflits dans vos requêtes SQL?
keystrokes
sont un sujet de préoccupation quand vous programme, vous devez reconsidérer votre cheminement de carrière!OK, tu m'as eu avec celui-ci, cette remarque mérite un +1 🙂
Déposer les backticks `, ils n'ont rien à voir avec SQL (vérifier les normes en vigueur!) et d'enregistrer des séquences de touches.
Ce n'est pas seulement
keystrokes
; il permet d'avoir une vue rigide. Il peut facilement créer le silence des problèmes où une colonne est ajoutée à une table, mais l'affichage n'est pas mis à jour. Je sais que théorie tout le monde devrait le type de tous les champs de tous les temps, mais souvent, les gens utilisent des programmes mapper automatiquement les colonnes pour eux, par exemple, PowerBI, EntityFramework, etc.
OriginalL'auteur mingos | 2011-02-23
Vous devez vous connecter pour publier un commentaire.
Mon expérience est que, bien que les avantages de la extra touches l'emporte sur le peu de temps qu'il faut pour taper de loin dans le long terme, au plus tard lorsque vous avez besoin de regarder une requête que vous avez écrit il y a un an ou si.
OriginalL'auteur René Nyffenegger
Peut-être vous pouvez essayer d'utiliser alias sur les noms de table ?
OriginalL'auteur Mulki
Vous avez besoin d'utiliser
alias.
Vous pouvez donner à une table ou une colonne d'un autre nom en utilisant un alias. Cela peut être une bonne chose à faire si vous avez de très longues ou complexes, table des noms ou des noms de colonnes.
Un nom d'alias pourrait être n'importe quoi, mais c'est court.
AS
utiliser un pseudonyme.Heikens: je sais, mais en utilisant le mot clé est bien pratique 🙂
OriginalL'auteur Sarfraz
Votre approche est la bonne, mais vous pouvez également fournir un alias pour votre table:
ici vous pouvez vous référer à la TableA simplement A.
OriginalL'auteur Anders Zommarin
La règle d'or est que si jamais vous êtes à l'aide de plus d'une table à tous, alias les tables, et explicitement alias de toutes les colonnes.
Cette cohérence, vous obtiendrez en profondeur dans la force, jeune padawan.
OriginalL'auteur RichardTheKiwi
Changer votre convention de nommage, de sorte que chaque élément de données possède un nom unique dans le schéma par exemple
auction_id
,bid_id
,user_id
, etc. Idéalement, le nom de l'élément de données ne changera pas entre les tables, mais parfois vous aurez besoin d'ajouter un qualificatif pour créer un synonyme par exempleadding_user_id
etbidding_user_id
siuser_id
est apparu deux fois dans la même table. Vous devriez document de noms d'élément de données et de leurs synonymes dans un dictionnaire de données.OriginalL'auteur onedaywhen
Vous pouvez également définir la colonne de la table à côté du nom de la table:
OriginalL'auteur giuseppe