Quand devrions-nous utiliser des entités faibles lors de la modélisation d'une base de données?

12

Il s'agit essentiellement d'une question sur les entités faibles. Quand devrions-nous les utiliser? Comment devraient-ils être modélisés?

Quelle est la principale différence entre les entités normales et les entités faibles? Les entités faibles correspondent-elles à des objets de valeur lors de la conception pilotée par domaine?

Pour aider à garder la question sur le sujet, voici un exemple tiré de Wikipedia que les gens peuvent utiliser pour répondre à cette question: entrez la description de l'image ici

Dans cet exemple, a OrderItemété modélisé comme une entité faible, mais je ne comprends pas pourquoi il ne peut pas être modélisé comme une entité normale.
Une autre question est de savoir si si je veux suivre l'historique des commandes (c'est-à-dire les changements dans son état), serait-ce une entité normale ou faible?

Songo
la source

Réponses:

10

Formellement, une entité «faible» présente les caractéristiques suivantes.

1.  It is existence-dependent on another entity, i.e., 
    it cannot exist without the entity with which it has a relationship.

2.  It inherits at least part of it's primary key from the entity to which 
    it is related. 


    i.e. -> A weak entity's primary key must be a composite key that includes 
       the primary key of the entity on which it is existence-dependent.

Je dirais que , dans la pratique , vous ne seriez pas ouvertement décider de faire quelque chose d' une entité « faible » en soi; vous structureriez plutôt les données pour qu'elles soient représentatives de tout ce que vous essayez de modéliser. Si, après avoir fait cela, vous regardez une entité particulière et qu'elle a les caractéristiques d'une entité "faible", vous pouvez la documenter ou la représenter en conséquence si, pour une raison quelconque, vous ressentez le besoin de l'appeler explicitement ou pour le bien de formalité.

Ed Hastings
la source
hmmm alors qu'en est-il de mon exemple? ici OrderItemdépend Ordercar aucun ne orderItemspeut exister sans appartenir à un order, mais je ne vois pas pourquoi je ne peux pas utiliser ItemLineNumberpour identifier uniquement un article?! En fait, je pourrais simplement faire ItemLineNumberune génération automatique intpour assurer l'unicité et utiliser une clé étrangère orderIDpour lier les deux entités ensemble?!
Songo
2
Si vous définissez votre OrderItem pour avoir un identifiant séquentiel d'identification unique et que le OrderId ne fait pas partie de la clé, alors vous traitez les OrderItems comme des citoyens de premier ordre et n'avez pas vraiment d'entité faible. Vous pouvez FK d'autres tables pour OrderItems individuellement si vous le souhaitez; il n'est pas nécessaire d'avoir déjà un OrderId pour accéder à OrderItems. D'un autre côté, si vous saisissiez OrderItem avec OrderId et un sequenceId (ou similaire) correspondant à la commande, vous auriez une entité faible et les éléments de campagne individuels ne pourraient être référencés qu'en utilisant OrderId et sequenceId. Utiliser le modèle comme prévu.
Ed Hastings
2
En outre, un commentaire tangentiel, il peut être très tentant de donner à chaque table sa propre clé primaire séquentielle et de garder les relations aussi simples que possible avec des relations PK-> FK à champ unique. C'est idéal pour les bases de données simples en particulier, et il est facile de raisonner. Cependant, lors de la modélisation de relations plus complexes et / ou sophistiquées, les clés composites deviennent très utiles et vous offrent plus d'options pour modéliser les nuances.
Ed Hastings
1

Un OrderItemne peut exister sans une commande ou un produit. Par conséquent, il est faible car ses dépendances le contrôlent.

Si vous supprimez par exemple la commande, vous n'avez aucun moyen de savoir où l'article doit être expédié. Ou si vous retirez le produit, vous ne savez pas quoi expédier.

jgauffin
la source
-1

Selon ma compréhension dans le diagramme ci-dessus, ils ont inclus les deux entités / tableaux au lieu d'un, c'est-à-dire les commandes et le poste de commande, de sorte que l'accès aux informations devient facile lorsque deux entités sont conçues. Et le poste de commande dépend de l'entité des commandes, il est donc considéré comme une entité faible. parce que la caractéristique d'une entité faible est qu'elle dépend d'une autre entité. Supposons que si vous n'incluez pas d'entité d'article de commande, comment pourrez-vous connaître le prix, la remise de l'article de commande. et comme l'a dit jgauffin Si vous supprimez par exemple la commande, vous n'avez aucun moyen de savoir où l'article doit être expédié. Ou si vous retirez le produit, vous ne savez pas quoi expédier.

Le diagramme ER doit être conçu en fonction des besoins de l'entreprise.

sam
la source
-1

Voir, une commande a de nombreux articles de commande (attribut à plusieurs valeurs). Ainsi, selon la règle, nous créons une table séparée.

Maintenant, disons que 2 clients ont la même commande. Par exemple, les deux achètent l'iPhone au même prix, remise, même date, etc. Donc, idéalement, il devrait y avoir deux tuples exacts pour la commande de l'iPhone en relation d'ordre. Mais selon la contrainte d'une relation, tous les tuples doivent être uniques. Permet donc de relier deux commandes au même problème item_line_number.no jusqu'à maintenant. Considérons maintenant l'un des annulations du client. Est-ce que l'iPhone est en ordre? Le tuple item_line_number sera également supprimé. Désormais, les autres clients qui ont acheté un iPhone sont également supprimés en raison de la correspondance M: 1. Donc, finalement, la base de données est incohérente. C'est pourquoi nous utilisons une clé de descripteur qui sera commandée. Ainsi, la suppression d'un iPhone commandé ne provoque pas de corruption de la base de données.

Baropie VIVEK
la source