Bei dieser Frage geht es nicht um den Unterschied zwischen SQL und NoSQL. Ich bin auf der Suche nach einer Begründung für etwas, das für mich im Moment wirklich keinen Sinn ergibt (möglicherweise aufgrund meines Unverständnisses oder meiner mangelnden Wertschätzung).
Wir haben ein neues Projekt mit MVC5, Entity Framework 6 Code First und SQL Server 2008 von Grund auf neu gestartet. Als der Architekt das Datenbankschema überprüfte, wurde angegeben, dass alle Fremdschlüssel und andere solche Einschränkungen entfernt werden sollten, da dies „Geschäftslogik“ und „Geschäftslogik“ ist sollte innerhalb der Business-Schicht des Anwendungscodes angewendet werden.
Meiner Meinung nach bilden Fremdschlüssel einen Teil der Daten- / Referenzintegrität und ahmen die Geschäftslogik nicht wirklich nach. Ich sehe Geschäftslogik eher als den Prozess und die Validierung, die steuern, was / wann / wie / warum Referenzen angewendet werden. Ich kann irgendwie verstehen, dass eindeutige Einschränkungen wohl Geschäftsprozesse sind, aber für mich ergänzt dies nur die Logik und ist Teil der Integrität.
Ein zweites Argument ist das Ziel eines NoSQL-Ansatzes für die Daten. Ich fand das wirklich ungewöhnlich und unorthodox: In Anbetracht der Verwendung von SQL-Server 2008, der Notwendigkeit der Berichterstellung, der nicht auf Terabyte skalierbaren Daten und der mangelnden Berücksichtigung von Technologien wie Mongo, Raven usw.
Hat jemand schon einmal ein solches Szenario erlebt? Warum sollte jemand einen NoSQL-Ansatz in einem SQL Server anwenden, der für referenzielle Daten konzipiert ist und keine Fremdschlüssel möchte?
quelle
Antworten:
Dann ist er ein Idiot, und ein Auszug aus Ihrer Codebasis wird wahrscheinlich eines Tages auf The Daily WTF landen. Sie haben absolut Recht, dass sein Ansatz keinen Sinn ergibt, und ehrlich gesagt auch nicht seine Erklärung.
Erklären Sie ihm, dass referenzielle Integritätsbedingungen keine "Geschäftslogik" sind. Sie sind ein Korrektheitsstandard mit einer eigenen eingebauten Verifikation. In der Geschäftslogik geht es darum, was Sie mit den Daten tun. Bei der Integrität geht es darum, sicherzustellen, dass die Daten selbst nicht beschädigt sind. Und wenn das nicht funktioniert ... ist er verantwortlich. Sie können entweder seinem Plan folgen und versuchen, den Schaden etwas abzumildern, oder nach einem besseren Arbeitsplatz suchen. (Oder beides.)
quelle
Abgesehen von pauschalen Aussagen sollte anerkannt werden, dass es legitime und starke Gründe gibt, sich dafür zu entscheiden, keine Eindeutigkeits- oder Fremdschlüsseleinschränkungen zu verwenden. Die meisten gehen so etwas:
Siehe auch Was ist los mit Fremdschlüsseln?
Aber diese stimmen nicht mit den Gründen in Ihrer Frage überein.
Dieser Grund ist ein bisschen seltsam. Eindeutigkeit und andere Integritätsbeschränkungen sind in hohem Maße die Domäne einer ACID-Datenbank. Ihr Anwendungscode kann die Atomaritäts- und Integritätsgarantien von SQLServer nicht erreichen. Wenn Sie starke Datenintegrität benötigen, wäre es dumm, die Datenbank zu ignorieren.
Der zweite Grund ist nicht wirklich ein Grund; Es ist eine Schlussfolgerung. Zwar sind Einschränkungen ein Kompromiss zwischen Korrektheit und Leistung, und NoSQL-Datenbanken tendieren zu letzterer.
Vielleicht hat Ihr Systemarchitekt diese legitimen Gründe im Sinn, und Sie haben es falsch verstanden. Oder vielleicht ist er ein quälender Idiot.
In jedem Fall gibt es gültige (wenn auch nicht universelle) Gründe, auf die Verwendung von Eindeutigkeits- und Fremdschlüsselbeschränkungen zu verzichten.
PS Wenn Sie zu dem Schluss kommen, dass Sie keine Fremdschlüssel möchten, können Sie trotzdem eine relationale Datenbank verwenden. Als Verallgemeinerung sind relationale Datenbanken ausgereifter als ihre NoSQL-Gegenstücke. Als einzelner Knoten können sie sogar schneller sein , und eine NoSQL-Abstraktion kann darauf aufgebaut werden .
quelle