Cette question ne concerne pas la différence entre SQL et NoSQL. Je cherche une justification pour quelque chose qui n'a vraiment aucun sens pour moi en ce moment (peut-être à cause de mon manque de compréhension ou d'appréciation).
Nous avons commencé un nouveau projet à partir de zéro en utilisant MVC5, le code Entity Framework 6 d'abord et SQL Server 2008. Lorsque l'architecte a examiné le schéma de la base de données, il a été déclaré que toutes les clés étrangères et autres contraintes de ce type devraient être supprimées car il s'agit de la «logique métier» et doit être appliqué dans la couche métier du code d'application.
Mon opinion est que les clés étrangères font partie de l'intégrité des données / référentielles et n'imitent pas vraiment la logique métier. Je vois la logique métier comme plus le processus et la validation qui contrôlent ce que / quand / comment / pourquoi les références sont appliquées. Je peux en quelque sorte comprendre que les contraintes uniques sont sans doute des processus métier, mais pour moi, cela complète simplement la logique et fait partie de l'intégrité.
Un deuxième argument est que l'objectif est d'adopter une approche NoSQL des données. J'ai trouvé cela vraiment inhabituel et peu orthodoxe: compte tenu de l'utilisation de SQL-Server 2008, de la nécessité de créer des rapports, des données non évolutives en téraoctets et du manque de considération pour les technologies telles que Mongo, Raven, etc.
Quelqu'un a-t-il déjà rencontré un tel scénario auparavant? Pourquoi quelqu'un adopterait-il une approche NoSQL dans un serveur SQL conçu pour les données référentielles et ne voudrait-il pas de clés étrangères?
la source
Réponses:
Ensuite, c'est un idiot, et un extrait de votre base de code est susceptible de se retrouver un jour sur The Daily WTF . Vous avez absolument raison de dire que son approche n'a pas de sens, et franchement, son explication non plus.
Essayez de lui expliquer que les contraintes d'intégrité référentielle ne sont pas de la «logique métier»; ils sont une norme d'exactitude avec sa propre vérification intégrée. La logique métier concerne ce que vous faites des données; l'intégrité consiste à s'assurer que les données elles-mêmes ne sont pas corrompues. Et si cela ne fonctionne pas ... eh bien, il est en charge. Vous pouvez soit suivre son plan et essayer d'atténuer quelque peu les dommages, soit commencer à chercher un meilleur endroit pour travailler. (Ou les deux.)
la source
Mis à part les déclarations générales, il convient de reconnaître qu'il existe des raisons légitimes et fortes de choisir de ne pas utiliser les contraintes d'unicité ou de clés étrangères. La plupart vont quelque chose comme ça:
Voir aussi Qu'est-ce qui ne va pas avec les clés étrangères?
Mais cela ne correspond pas aux raisons de votre question.
Cette raison est un peu étrange. L'unicité et d'autres contraintes d'intégrité sont en grande partie le domaine d'une base de données ACID. Votre code d'application ne peut pas approcher les garanties d'atomicité et d'intégrité de SQLServer. Si vous avez besoin d'une forte intégrité des données, vous seriez stupide d'ignorer la base de données.
La deuxième raison n'est pas vraiment une raison; c'est une conclusion. Bien qu'il soit vrai que les contraintes sont un compromis entre l'exactitude et les performances, et les bases de données NoSQL biaisent vers ces dernières.
Peut-être que votre architecte système a ces raisons légitimes à l'esprit, et vous avez mal entendu. Ou peut-être qu'il est un idiot bavard.
Dans tous les cas, il existe des raisons valables (mais pas universelles) de s'abstenir d'utiliser l'unicité et les contraintes de clé étrangère.
PS Si vous concluez que vous ne voulez pas de clés étrangères, vous pouvez toujours utiliser une base de données relationnelle. En général, les bases de données relationnelles sont plus matures que leurs homologues NoSQL. En tant que nœud unique, ils peuvent même être plus rapides , et une abstraction NoSQL peut être construite sur eux .
la source