Je suis occupé à créer un site Web de base en ecommerce et je voudrais savoir quelle est la meilleure des deux options suivantes concernant la manière dont je stocke les adresses de facturation et de livraison. Je suis ouvert à toutes les autres suggestions.
Je peux inclure l'adresse de facturation et l'adresse de livraison dans le tableau de commande: p> sinon je peux créer une autre table qui va simplement stocker Adresses pour les commandes: P> order
-------
billing_address_id
shipping_address_id
order_address
-------
address_id
name
address
state
8 Réponses :
Cela dépend si des adresses sont réutilisées. p>
Si vous avez une table "client enregistrée", vous devez absolument opter pour l'option avec "Livraison_Adress", "Billing_Adress", etc. Tables, chaque enregistrement d'entre eux étant lié à un client. P>
edit: strong> basé sur le nouveau commentaire, où vous allez copier à partir d'un carnet d'adresses, une table de commande_Address peut conserver votre nettoyeur de table de commande pour le faire, mais si vous allez Pour dupliquer les données quand même, je dirais copier le copier à l'enregistrement qu'il appartient aussi. P>
- p>
Les deux dénormalisent l'expédition et conservez-les avec la commande. Le stockage est bon marché et il est plus facile que de gérer un tas de données supplémentaires dans la table d'adresses. Mais gardez les adresses divisées afin que les clients ne soient pas obligés de les entrer à nouveau. Si vous vous dénormez, vous n'avez pas besoin de conserver des enregistrements explicites dans votre table d'adresses pour eux et de vous soucier de faire des suppresses molles. P>
Ne sous-estimez pas la complexité des adresses de gestion. Si je saisis une adresse dans votre système et que je l'associe à mon compte, puis réalisez une partie de celle-ci est fausse, vous devez supprimer l'ancien et en créer un nouveau. La suppression peut être une suppression douce, mais elle doit être retirée. Vous pouvez essayer de décider si je mettais une nouvelle adresse ou je modifiant radicalement l'ancien. Ou vous pouvez uniquement permettre d'ajouter et de supprimer des adresses. Mais lorsque les opérations se produisent avec des adresses, les ordonnances précédentes doivent conserver les données qui lui ont été attribuées en premier lieu. Modification d'une adresse déjà associée à une commande, modifierait l'endroit où la commande a été envoyée, après avoir déjà été envoyée. Assurez-vous de penser à ces scénarios. Il existe plusieurs façons de résoudre les problèmes potentiels, mais votre décision est réellement basée sur la manière dont vous souhaitez gérer ces situations. Si vous dénormalisez et copiez les informations d'adresse à la commande une fois qu'elle est placée, les adresses d'édition dans le tableau d'adresses deviennent moins un problème. Décidez comment gérer ces situations et votre schéma de base de données doit simplement supporter cela. Soit le choix fonctionne. P>
Une table avec l'adresse de facturation et d'adresse d'expédition vous permettra de mieux servir si vous envisagez d'enregistrer les utilisateurs de votre site, vous pouvez également passer la commande dans une autre table et utiliser les identifiants que vous devez déjà corréler les données entre les informations de commande <=> Adresses de facturation / expédition p>
La deuxième méthode a quelques avantages sur le premier. Il est plus facile d'avoir les adresses les mêmes, comme elles seront souvent, avec moins de possibilités d'erreur. De plus, si vous enregistrez déjà des adresses dans un compte, la deuxième méthode vous donnera une heure plus facile. Cela dit, vous devez vérifier qu'une adresse donnée appartient réellement au même compte que l'ordre, que vous pourriez faire en incluant un champ client code> dans la commande code> et < Code> Commande_Address CODE> Tables, y compris Customer_ID CODE> dans la clé primaire de Commande_Address Code> et la clé étrangère à partir de Commandez CODE> Order_Address code>. p>
Je garderais les adresses dans un tableau séparé et référez-les des commandes. J'inclurais un attribut "CurrentAddress", de sorte qu'un utilisateur final puisse "supprimer" cette adresse de leur liste d'adresse actuelle. La valeur existerait toujours dans le tableau afin que les commandes précédentes puissent faire référence à l'adresse à des fins historiques, mais ce ne serait plus une adresse sélectionnable au moment de la commande. P>
tirage des adresses dans des tables distinctes est plus normalisée, mais faites attention. Si vous autorisez les adresses à mettre à jour, vous pouvez perdre une trace de l'endroit où la commande était initialement destinée à être facturée à / expédiée à. P>
Je choisirais généralement la seconde. Cela vous permettra d'avoir de nombreuses adresses différentes pour un client de différents types. Mais je voudrais normalement aborder cela au niveau du client, puis abordez les commandes et les factures. P>
Cependant, vous devrez peut-être répondre à la nature de votre flux de travail de commande / de vos règles commerciales. P>
Une fois la commande terminée, est-ce un document (comme une facture)? Si tel est le cas, l'adresse doit être verrouillée à ce moment-là et ne peut pas être modifiée, sinon vous ne pouvez pas être en mesure de ré-présenter le document d'origine. P>
Lorsqu'un client modifie leur adresse de facturation, l'adresse de facturation d'un vieil ordonnance est-elle même plus importante? Dans ce cas, l'adresse de facturation n'a même pas besoin d'être liée à la commande, uniquement du client. Si vous deviez ré-présenter les commandes de paiement, vous les présenteriez à leur adresse de facturation actuelle. P>
+1: Mes sentiments exactement, j'aimerais pouvoir uppoter à nouveau. Bien que la normalisation est ce que nous nous efforçons, il dépend d'en premier lieu des règles commerciales - car dans une configuration normalisée, la mise à jour d'une adresse affecterait les archives historiques.
@OMG Poneys et lors de la mise à jour d'une adresse sur laquelle plusieurs éléments sont liés à, une décision de conception doit être effectuée s'il faut changer de place ou diviser l'adresse, et si le scission, qui planifie à l'adresse modifiée. Et ces choix peuvent encore être faits même si tous les changements sont connectés à des tables d'audit ou autre.
J'ai compris l'utilisateur d'avoir une conception à l'esprit légèrement plus complexe, dans laquelle plusieurs adresses seraient stockées pour chaque client avec un nouveau supplémentaire que lorsque le client souhaitait une commande d'expédition à une adresse alternative ou nouvelle. L'historique des commandes indiquerait alors divers enregistrements dans le tableau d'adresses en fonction duquel l'utilisateur avait spécifié à l'heure ou à la commande.
Exactement ce que je venais, mais beaucoup plus clair. Bonne réponse.
Personnellement, je n'aime pas non plus de vos solutions bien que la deuxième solution soit "plus tôt" en termes de théorie de la base de données. Si vous avez répété des adresses, vous devez les stocker une fois. p>
Le problème vient dans la mise en œuvre. Lorsqu'une commande est passée, vous devrez prendre une décision si vous souhaitez utiliser une adresse existante, mettez à jour une adresse existante (par exemple, avec un numéro d'appartement nouvellement ajouté) ou créer une nouvelle adresse (le client a déménagé. , a une nouvelle adresse d'été, peu importe). P>
Pour ce faire, une personne (un employé pour les ventes directes ou les ventes directes, le client ou le programme de vente en ligne) devra prendre une décision quant à savoir si vous effectuez une mise à jour de l'adresse ou une opération d'addition d'adresse . Il est très difficile de demander aux utilisateurs de faire ce genre de décision avec précision. Si une mise à jour est effectuée lorsqu'une addition était vraiment nécessaire, vous avez corrompu votre historique de commande (les commandes plus anciennes indiquent la nouvelle adresse). Si une addition est effectuée lorsqu'une mise à jour était le bon choix, vous avez éliminé la valeur de la structure normalisée. P>
Dans les situations comme celle-ci, je ne suis pas tout à fait heureux, à la conclusion que la meilleure option est de stocker une ou plusieurs adresses pour le client, puis copier les informations d'adresse dans les champs d'adresses de l'ordre même. p>
Si vous choisissez votre deuxième option, vous devez planifier l'écriture d'une interface utilisateur vraiment bonne em> au système d'adresses afin d'éviter le type de problèmes que j'ai mentionnés ci-dessus. Et rappelez-vous que non seulement vous, mais chaque programmeur qui travaille sur le projet à l'avenir va devoir comprendre et mettre d'accord sur la gestion de ce tableau d'adresses. P>
Exactement, ce scénario spécifique est plus grand que "de normaliser, ou de ne pas normaliser". Bonne réponse.
Larry a cloué. Mot du temps que vous voulez que la commande soit immuable après avoir été traitée. Un moyen simple de gérer cela est d'avoir la même classe d'adresses pouvant être utilisée tout au long, mais simplement pour le sérialiser dans les deux champs de commande (facturation_address, expédition_address). Vous pouvez réutiliser le même code pour vos adresses clientes qui sont stockées dans un tableau d'adresses réelle (avec un champ Type d'adresse). Ainsi, les clients pourraient avoir autant d'adresses qu'ils aiment (des cadeaux d'expédition directement au destinataire), modifient ces adresses, puis choisissez ce qu'ils utilisent pour une commande (qui sont sérialisées).
@Larry tu as eu mon frère. bien dit.
Désolé, j'aurais dû ajouter ceci à ma question initiale. Ce que je pensais faire était d'avoir une autre table pour stocker les adresses clientes qui pourraient agir comme un carnet d'adresses et que le tableau d'adresses de commande supplémentaire serait de pour pouvoir stocker définitivement les adresses fournies pour une commande, puis le client a décidé. Pour mettre à jour une adresse dans le tableau d'adresses client, il n'affectera pas les adresses fournies pour la commande. Cela serait-ce trop?