PDA

View Full Version : آیا یکپارچگی و کیفیت اطلاعات دیتابیس باید لزوما در سطح دیتابیس تضمین شود؟



Hamid2547
شنبه 08 مهر 1391, 18:11 عصر
سلام
آیا تضمین صحت و درستی اطلاعات وارد شده باید حتما در سطح دیتابیس چک و تضمین شود؟ منظور من همان (referential integrity) هست آیا میتوان آن را در سطح برنامه چک کرد و از پیچیدگی های دیتابیس کم کرد؟ منظور زمانی است که اختیار کار در دست برنامه نویس است و برنامه نویس اگر بخواهد میتواند در دیتابیس اطلاعات غلط وارد کند و در این مورد به برنامه نویس اعتماد شده است، به نظر شما کدام یک از این دو روش بهتر است؟ این پست (http://barnamenevis.org/showthread.php?334611-%D8%B7%D8%B1%D8%A7%D8%AD%DB%8C-%D8%AF%DB%8C%D8%AA%D8%A7%D8%A8%DB%8C%D8%B3-%D8%B3%DB%8C%D8%B3%D8%AA%D9%85-%DA%A9%D8%A7%D9%85%D9%86%D8%AA-%DA%AF%D8%B0%D8%A7%D8%B1%DB%8C-%D8%B3%D8%A7%DB%8C%D8%AA&p=1494166&viewfull=1#post1494166) نمونه ی خوبی از سوال من است که اطلاعات را در سطح دیتابیس میتوان غلط وارد کرد ولی برنامه نویس در کدهای خود تضمین میکند که اطلاعات غلط وارد نشود، ایا این روش پذیرفتنی و استاندارد است و دیتابیس در این حالت نرمال محسوب میشود؟ یا باید تا میشود در سطح دیتابیس از درستی اطلاعات وارد شده اطمینان حاصل کرد؟

حمیدرضاصادقیان
شنبه 08 مهر 1391, 21:33 عصر
سلام.
اصولا در طراحی دیتابیس شما باید صحت اطلاعات رو تضمین کنید.
این اصلا دلیل خوبی نیست بگیم صحت اطلاعات از داخل نرم افزار کنترل میشه و اگر کاربر از پشت سیستم خواست خرابکاری کنه به ما ربطی نداره.
در سیستم های بانک اطلاعاتی ، شما باید حتی المقدور جلوی خرابکاری های غیر معمول رو بگیرید.
در نرم افزار های سه لایه معمولا این کنترل صحت اطلاعات در Business Layer انجام میشه بعد داده ها در صورت صحت به Data Layer ارسال میشه.
حتی در سطح خود دیتابیس با استفاده از Check Constraint ، Trigger ،UDF و... سعی میشه جلوی همه این خرابکاری ها گرفته بشه.
بعضی از کارها نیازی نیست در سطح دیتابیس انجام بشه و بهتره در همون سمت Client کنترل بشه. مانند صحت ورود تاریخ ، صحت شماره سند یا خالی نبودن شماره حساب.
ولی اینکه سند مورد نظر تکراری هست یا خیر بهتره در سمت دیتابیس انجام بشه و در صورت رخداد تکرار ، یک Exception ایجاد بشه و کاربر از این قضیه مطلع بشه.

mohsen_sh
شنبه 10 فروردین 1392, 07:27 صبح
سلام.
با سؤال شما یادی از یکی از اساتید دوران تحصیل می کنم، هر وقت پروژه ای رو واسه تحویل می بردیم پیشش مستقیم میرفت سراغ دیتابیس و دیتا وارد می کرد.
من هم معتقدم جامعیت(ACIDکنترل) بایستی در سطح دیتا بیس انجام بشه.

tooraj_azizi_1035
شنبه 10 فروردین 1392, 13:58 عصر
آیا تضمین صحت و درستی اطلاعات وارد شده باید حتما در سطح دیتابیس چک و تضمین شود؟ م
ما در نوشتن Data Application فازی به نام Validation داریم که میاد معتبر بودن اطلاعات وارده رو چک میکنه. مثلاً در برنامه هایی که از Dataset استفاده می کنند این کار در خود Datasetانجام میشه تا در سطح Application خودش رو نشون بده.



منظور من همان (referential integrity) هست آیا میتوان آن را در سطح برنامه چک کرد و از پیچیدگی های دیتابیس کم کرد؟


Referential Integrity جزو کارهایی است که به Database Engine سپرده شده تا اگه شما خواستید اون رو اعمال کنه.

متنی در این لینک:http://msdn.microsoft.com/en-us/library/aa902684%28v=sql.80%29.aspx

Data is usually spread across several tables, which are related to each other through key columns. Database normalization is used to avoid duplicates in a database, thus avoiding potential errors. Although it's true that database normalization minimizes the chance for errors, it doesn't eliminate them. There is still the need for a set of data-integrity rules that will enforce the relationships between tables and keep the database as consistent as possible. This set of rules is called referential integrity, and it is a part of the wider set of rules that enforce data integrity in general.

حمیدرضاصادقیان
یک شنبه 11 فروردین 1392, 23:30 عصر
به جز این شما میتوانید از Business Rule Engine ها استفاده کنید. برای کسب اطلاعات بیشتر اینجا (http://en.wikipedia.org/wiki/Business_rules_engine) و اینجا (http://msdn.microsoft.com/en-us/library/aa561216.aspx) رو نیز مطالعه کنید