فصل ۲ — مفاهیم RDBMS در SQL
RDBMS چیست؟
RDBMS مخفف Relational Database Management System یا «سامانهٔ مدیریت پایگاه دادهٔ رابطهای» است. RDBMS زیربنای SQL و بسیاری از سامانههای پایگاه دادهٔ مدرن مانند MS SQL Server، IBM DB2، Oracle، MySQL و Microsoft Access است.
سامانهٔ مدیریت پایگاه دادهٔ رابطهای، نوعی سامانهٔ مدیریت پایگاه داده (DBMS) است که بر مدل رابطهای معرفیشده توسط E. F. Codd بنا شده است.
جدول چیست؟
دادهها در RDBMS در اشیای پایگاه دادهای به نام «جدول» ذخیره میشوند. جدول مجموعهای از دادههای مرتبط است و از ستونها و سطرها تشکیل میشود.
جدول رایجترین و سادهترین شکل ذخیرهسازی داده در یک پایگاه دادهٔ رابطهای است. نمونهٔ زیر جدول CUSTOMERS را نشان میدهد:
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
+----+----------+-----+-----------+----------+
فیلد چیست؟
هر جدول به اجزای کوچکتری به نام فیلد تقسیم میشود. فیلدهای جدول CUSTOMERS عبارتاند از ID، NAME، AGE، ADDRESS و SALARY.
فیلد ستونی در جدول است که برای نگهداری نوع مشخصی از اطلاعات دربارهٔ هر رکورد جدول طراحی شده است.
رکورد یا سطر چیست؟
هر ورودی مستقل در یک جدول «رکورد» نام دارد و به آن سطر داده نیز گفته میشود. برای مثال، جدول CUSTOMERS بالا ۷ رکورد دارد. یک رکورد منفرد از این جدول به صورت زیر است:
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
+----+----------+-----+-----------+----------+
رکورد یک موجودیت افقی در جدول است.
ستون چیست؟
ستون یک موجودیت عمودی در جدول است که همهٔ اطلاعات مربوط به یک فیلد مشخص را در خود نگه میدارد. برای مثال، ستون ADDRESS در جدول CUSTOMERS محل را توصیف میکند و شامل مقادیر زیر است:
+-----------+
| ADDRESS |
+-----------+
| Ahmedabad |
| Delhi |
| Kota |
| Mumbai |
| Bhopal |
| MP |
| Indore |
+-----------+
مقدار NULL چیست؟
مقدار NULL در یک جدول، مقداری در فیلد است که خالی به نظر میرسد؛ یعنی فیلدی با مقدار NULL هیچ مقدار شناختهشدهای ندارد.
درک این نکته بسیار مهم است که NULL با مقدار صفر یا فیلدی که شامل فاصله است تفاوت دارد. فیلدی با مقدار NULL فیلدی است که هنگام ایجاد رکورد بدون مقدار باقی مانده است.
محدودیتهای SQL
Constraint (محدودیت) قواعدی است که بر ستونهای دادهٔ یک جدول اعمال میشود. این قواعد نوع دادهای را که میتواند وارد جدول شود محدود میکنند و به دقت و قابلیت اعتماد دادههای پایگاه داده کمک میکنند.
محدودیتها میتوانند در سطح ستون یا در سطح جدول باشند. محدودیت سطح ستون فقط روی یک ستون اعمال میشود، در حالی که محدودیت سطح جدول کل جدول را در بر میگیرد.
محدودیتهای رایج SQL عبارتاند از:
NOT NULL: تضمین میکند ستون نتواند مقدار NULL داشته باشد.
DEFAULT: اگر مقداری مشخص نشود، یک مقدار پیشفرض برای ستون فراهم میکند.
UNIQUE: تضمین میکند همهٔ مقادیر یک ستون متفاوت باشند.
PRIMARY KEY: هر سطر یا رکورد جدول را بهطور یکتا شناسایی میکند.
FOREIGN KEY: سطر یا رکوردی را از طریق کلیدی که با کلید اصلی جدول دیگری مطابقت دارد مرتبط میکند.
CHECK: تضمین میکند تمام مقادیر یک ستون شرط یا شرایط معینی را برآورده کنند.
INDEX: برای ایجاد دسترسی و بازیابی سریعتر دادهها بهکار میرود.
محدودیت NOT NULL
بهطور پیشفرض یک ستون میتواند مقدار NULL داشته باشد. اگر نمیخواهید ستونی مقدار NULL بپذیرد، باید برای آن محدودیتی تعریف کنید که NULL را مجاز نداند.
NULL صرفاً به معنی «نبود داده» نیست، بلکه دادهٔ ناشناخته را نمایش میدهد.
مثال: SQL زیر جدول جدیدی به نام CUSTOMERS با پنج ستون ایجاد میکند. سه ستون ID، NAME و AGE نباید مقدار NULL بپذیرند:
CREATE TABLE CUSTOMERS(
ID INT NOT NULL,
NAME VARCHAR (20) NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR (25) ,
SALARY DECIMAL (18, 2),
PRIMARY KEY (ID)
);
اگر جدول CUSTOMERS از قبل ایجاد شده باشد، برای افزودن محدودیت NOT NULL به ستون SALARY در Oracle و MySQL میتوان دستوری شبیه زیر نوشت:
ALTER TABLE CUSTOMERS
MODIFY SALARY DECIMAL (18, 2) NOT NULL;
محدودیت DEFAULT
محدودیت DEFAULT زمانی که دستور INSERT INTO برای یک ستون مقدار مشخصی ارائه نکند، مقدار پیشفرض آن ستون را تأمین میکند.
مثال: در SQL زیر ستون SALARY بهطور پیشفرض برابر 5000.00 قرار داده شده است. بنابراین اگر INSERT INTO مقداری برای این ستون ارائه نکند، مقدار ستون بهصورت پیشفرض 5000.00 خواهد بود.
CREATE TABLE CUSTOMERS(
ID INT NOT NULL,
NAME VARCHAR (20) NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR (25) ,
SALARY DECIMAL (18, 2) DEFAULT 5000.00,
PRIMARY KEY (ID)
);
اگر جدول CUSTOMERS از قبل وجود داشته باشد، برای افزودن مقدار پیشفرض به ستون SALARY میتوان دستوری شبیه زیر نوشت:
ALTER TABLE CUSTOMERS
MODIFY SALARY DECIMAL (18, 2) DEFAULT 5000.00;
حذف محدودیت DEFAULT
برای حذف محدودیت DEFAULT از SQL زیر استفاده میشود:
ALTER TABLE CUSTOMERS
ALTER COLUMN SALARY DROP DEFAULT;
محدودیت UNIQUE
محدودیت UNIQUE مانع از آن میشود که دو رکورد در یک ستون مشخص مقادیر یکسان داشته باشند. برای نمونه، در جدول CUSTOMERS ممکن است بخواهید از داشتن سن یکسان برای دو یا چند نفر جلوگیری کنید.
مثال: در SQL زیر ستون AGE بهصورت UNIQUE تعریف شده است و بنابراین دو رکورد نمیتوانند سن یکسان داشته باشند:
CREATE TABLE CUSTOMERS(
ID INT NOT NULL,
NAME VARCHAR (20) NOT NULL,
AGE INT NOT NULL UNIQUE,
ADDRESS CHAR (25) ,
SALARY DECIMAL (18, 2),
PRIMARY KEY (ID)
);
اگر جدول از قبل وجود داشته باشد، برای افزودن UNIQUE به ستون AGE میتوان نوشت:
ALTER TABLE CUSTOMERS
MODIFY AGE INT NOT NULL UNIQUE;
برای نامگذاری محدودیت و اعمال آن روی چند ستون نیز میتوان از نحو زیر استفاده کرد:
ALTER TABLE CUSTOMERS
ADD CONSTRAINT myUniqueConstraint UNIQUE(AGE, SALARY);
حذف محدودیت UNIQUE
ALTER TABLE CUSTOMERS
DROP CONSTRAINT myUniqueConstraint;
اگر از MySQL استفاده میکنید، نحو زیر نیز قابل استفاده است:
ALTER TABLE CUSTOMERS
DROP INDEX myUniqueConstraint;
PRIMARY KEY (کلید اصلی)
کلید اصلی فیلدی در جدول است که هر سطر یا رکورد را بهصورت یکتا شناسایی میکند. کلید اصلی باید مقادیر یکتا داشته باشد و ستون کلید اصلی نمیتواند مقدار NULL داشته باشد.
هر جدول فقط یک کلید اصلی دارد، اما آن کلید میتواند از یک یا چند فیلد تشکیل شود. اگر چند فیلد با هم کلید اصلی را تشکیل دهند، به آن «کلید مرکب» گفته میشود.
اگر کلید اصلی روی یک یا چند فیلد تعریف شده باشد، دو رکورد نمیتوانند در تمام آن فیلدهای کلیدی مقدار یکسان داشته باشند.
ایجاد کلید اصلی
نحو زیر ویژگی ID را بهعنوان کلید اصلی جدول CUSTOMERS تعریف میکند:
CREATE TABLE CUSTOMERS(
ID INT NOT NULL,
NAME VARCHAR (20) NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR (25) ,
SALARY DECIMAL (18, 2),
PRIMARY KEY (ID)
);
اگر جدول CUSTOMERS از قبل وجود داشته باشد، برای ایجاد محدودیت PRIMARY KEY روی ستون ID از نحو زیر استفاده میشود:
ALTER TABLE CUSTOMER ADD PRIMARY KEY (ID);
برای تعریف کلید اصلی روی چند ستون:
CREATE TABLE CUSTOMERS(
ID INT NOT NULL,
NAME VARCHAR (20) NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR (25) ,
SALARY DECIMAL (18, 2),
PRIMARY KEY (ID, NAME)
);
اگر جدول از قبل وجود داشته باشد، برای ایجاد کلید اصلی روی ستونهای ID و NAME میتوان نوشت:
ALTER TABLE CUSTOMERS
ADD CONSTRAINT PK_CUSTID PRIMARY KEY (ID, NAME);
حذف کلید اصلی
ALTER TABLE CUSTOMERS DROP PRIMARY KEY ;
FOREIGN KEY (کلید خارجی)
کلید خارجی برای پیوند دادن دو جدول به یکدیگر استفاده میشود و گاهی «کلید ارجاعی» نیز نامیده میشود.
کلید خارجی یک ستون یا ترکیبی از ستونهاست که مقادیر آن با یک کلید اصلی در جدولی دیگر مطابقت دارد. رابطهٔ میان دو جدول با تطبیق کلید اصلی در یک جدول و کلید خارجی در جدول دوم شکل میگیرد.
اگر جدولی روی یک یا چند فیلد کلید اصلی داشته باشد، دو رکورد نمیتوانند برای مجموعهٔ آن فیلدهای کلیدی مقدار یکسان داشته باشند.
مثال: ساختار دو جدول زیر را در نظر بگیرید:
جدول CUSTOMERS:
CREATE TABLE CUSTOMERS(
ID INT NOT NULL,
NAME VARCHAR (20) NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR (25) ,
SALARY DECIMAL (18, 2),
PRIMARY KEY (ID)
);
جدول ORDERS:
CREATE TABLE ORDERS (
ID INT NOT NULL,
DATE DATETIME,
CUSTOMER_ID INT references CUSTOMERS(ID),
AMOUNT double,
PRIMARY KEY (ID)
);
اگر جدول ORDERS از قبل ایجاد شده ولی کلید خارجی هنوز تعریف نشده باشد، میتوان با تغییر جدول کلید خارجی را مشخص کرد:
ALTER TABLE ORDERS
ADD FOREIGN KEY (Customer_ID) REFERENCES CUSTOMERS (ID);
حذف محدودیت FOREIGN KEY
ALTER TABLE ORDERS
DROP FOREIGN KEY;
محدودیت CHECK
محدودیت CHECK اجازه میدهد شرطی برای بررسی مقدار واردشده در رکورد تعیین شود. اگر نتیجهٔ شرط نادرست باشد، رکورد محدودیت را نقض میکند و وارد جدول نمیشود.
مثال: SQL زیر جدول CUSTOMERS را ایجاد میکند و روی ستون AGE شرطی میگذارد تا مشتری با سن کمتر از ۱۸ سال ثبت نشود:
CREATE TABLE CUSTOMERS(
ID INT NOT NULL,
NAME VARCHAR (20) NOT NULL,
AGE INT NOT NULL CHECK (AGE >= 18),
ADDRESS CHAR (25) ,
SALARY DECIMAL (18, 2),
PRIMARY KEY (ID)
);
اگر جدول از قبل ایجاد شده باشد، برای افزودن محدودیت CHECK به ستون AGE میتوان نوشت:
ALTER TABLE CUSTOMERS
MODIFY AGE INT NOT NULL CHECK (AGE >= 18 );
برای نامگذاری محدودیت نیز نحو زیر قابل استفاده است:
ALTER TABLE CUSTOMERS
ADD CONSTRAINT myCheckConstraint CHECK(AGE >= 18);
حذف محدودیت CHECK
برای حذف محدودیت CHECK از SQL زیر استفاده میشود. طبق متن منبع، این نحو در MySQL کار نمیکند:
ALTER TABLE CUSTOMERS
DROP CONSTRAINT myCheckConstraint;
INDEX (ایندکس)
INDEX (ایندکس) برای ایجاد دسترسی و بازیابی بسیار سریع دادهها از پایگاه داده بهکار میرود. ایندکس میتواند با یک ستون یا گروهی از ستونهای جدول ساخته شود. متن منبع توضیح میدهد که هنگام ایجاد ایندکس، پیش از مرتبسازی دادهها برای هر سطر یک ROWID تخصیص داده میشود.
ایندکسهای مناسب برای Performance (کارایی) پایگاههای دادهٔ بزرگ مفیدند، اما هنگام ایجاد آنها باید دقت کرد. انتخاب فیلدها به نحوهٔ استفاده از آنها در پرسوجوهای SQL بستگی دارد.
مثال: ابتدا جدول CUSTOMERS ایجاد میشود:
CREATE TABLE CUSTOMERS(
ID INT NOT NULL,
NAME VARCHAR (20) NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR (25) ,
SALARY DECIMAL (18, 2),
PRIMARY KEY (ID)
);
اکنون میتوان با نحو زیر روی یک یا چند ستون ایندکس ایجاد کرد:
CREATE INDEX index_name
ON table_name ( column1, column2.....);
برای ایجاد ایندکس روی ستون AGE و بهینهسازی جستوجوی مشتریان بر اساس سن:
CREATE INDEX idx_age
ON CUSTOMERS ( AGE );
حذف ایندکس
ALTER TABLE CUSTOMERS
DROP INDEX idx_age;
یکپارچگی داده
در هر RDBMS دستههای زیر از یکپارچگی داده وجود دارد:
- یکپارچگی موجودیت: در یک جدول سطر تکراری وجود ندارد.
- یکپارچگی دامنه: با محدود کردن نوع، قالب یا دامنهٔ مقادیر، فقط ورودیهای معتبر برای یک ستون پذیرفته میشوند.
- یکپارچگی ارجاعی: سطرهایی که رکوردهای دیگر از آنها استفاده میکنند نباید حذف شوند.
- یکپارچگی تعریفشده توسط کاربر: قواعد کسبوکار مشخصی را اعمال میکند که در دستههای موجودیت، دامنه یا ارجاعی قرار نمیگیرند.
نرمالسازی پایگاه داده
نرمالسازی پایگاه داده فرایند سازماندهی کارآمد دادهها در پایگاه داده است. این فرایند دو هدف اصلی دارد:
- حذف دادههای زائد؛ برای مثال جلوگیری از ذخیرهٔ همان داده در بیش از یک جدول.
- اطمینان از منطقی بودن وابستگیهای داده.
هر دو هدف مهماند، زیرا فضای مصرفی پایگاه داده را کاهش میدهند و باعث میشوند دادهها بهصورت منطقی ذخیره شوند. نرمالسازی مجموعهای از راهنماهاست که به طراحی ساختار مناسب پایگاه داده کمک میکند.
راهنماهای نرمالسازی به «فرمهای نرمال» تقسیم میشوند. هدف این است که ساختار پایگاه داده ابتدا با قواعد فرم نرمال اول، سپس فرم نرمال دوم و در نهایت فرم نرمال سوم سازگار شود.
میتوان نرمالسازی را تا فرم نرمال چهارم، پنجم و بیشتر ادامه داد، اما متن منبع بیان میکند که در حالت عمومی فرم نرمال سوم کافی است.
- فرم نرمال اول (
1NF)
- فرم نرمال دوم (
2NF)
- فرم نرمال سوم (
3NF)
فرم نرمال اول (1NF)
فرم نرمال اول قواعد پایهای زیر را برای یک پایگاه دادهٔ سازمانیافته تعیین میکند:
- اقلام دادهٔ موردنیاز را تعریف کنید؛ زیرا این اقلام به ستونهای جدول تبدیل میشوند. دادههای مرتبط را در یک جدول قرار دهید.
- اطمینان حاصل کنید گروههای تکرارشوندهٔ داده وجود نداشته باشند.
- اطمینان حاصل کنید کلید اصلی وجود دارد.
قاعدهٔ اول 1NF
باید اقلام داده را تعریف کنید. یعنی دادههایی را که قرار است ذخیره شوند بررسی کنید، آنها را در ستونها سازمان دهید، نوع دادهٔ هر ستون را مشخص کنید و در پایان ستونهای مرتبط را در جدول مربوط به خود قرار دهید.
برای مثال، تمام ستونهای مربوط به محل جلسات را در جدول Location و ستونهای مربوط به اعضا را در جدول MemberDetails قرار میدهید.
قاعدهٔ دوم 1NF
گام بعدی اطمینان از نبود گروههای تکرارشوندهٔ داده است. جدول زیر را در نظر بگیرید:
CREATE TABLE CUSTOMERS(
ID INT NOT NULL,
NAME VARCHAR (20) NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR (25),
ORDERS VARCHAR(155)
);
اگر این جدول را برای یک مشتری دارای چند سفارش پر کنیم، دادهها میتوانند چنین باشند:
ID NAME AGE ADDRESS ORDERS
100 Sachin 36 Lower West Side Cannon XL-200
100 Sachin 36 Lower West Side Battery XL-200
100 Sachin 36 Lower West Side Tripod Large
طبق 1NF نباید گروههای تکرارشونده داشته باشیم. بنابراین جدول بالا را به دو بخش تقسیم کرده و با یک کلید به هم مرتبط میکنیم.
جدول CUSTOMERS:
CREATE TABLE CUSTOMERS(
ID INT NOT NULL,
NAME VARCHAR (20) NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR (25),
PRIMARY KEY (ID)
);
این جدول رکورد زیر را خواهد داشت:
ID NAME AGE ADDRESS
100 Sachin 36 Lower West Side
جدول ORDERS:
CREATE TABLE ORDERS(
ID INT NOT NULL,
CUSTOMER_ID INT NOT NULL,
ORDERS VARCHAR(155),
PRIMARY KEY (ID)
);
این جدول رکوردهای زیر را خواهد داشت:
ID CUSTOMER_ID ORDERS
10 100 Cannon XL-200
11 100 Battery XL-200
12 100 Tripod Large
قاعدهٔ سوم 1NF
قاعدهٔ نهایی فرم نرمال اول این است که برای هر جدول یک کلید اصلی ایجاد شود؛ کاری که در جدولهای بالا انجام شده است.
فرم نرمال دوم (2NF)
فرم نرمال دوم بیان میکند که جدول باید تمام قواعد 1NF را رعایت کند و هیچ وابستگی جزئی از ستونها به کلید اصلی وجود نداشته باشد.
رابطهٔ مشتری–سفارش را در نظر بگیرید که در آن میخواهید شناسهٔ مشتری، نام مشتری، شناسهٔ سفارش، جزئیات سفارش و تاریخ خرید را ذخیره کنید:
CREATE TABLE CUSTOMERS(
CUST_ID INT NOT NULL,
CUST_NAME VARCHAR (20) NOT NULL,
ORDER_ID INT NOT NULL,
ORDER_DETAIL VARCHAR (20) NOT NULL,
SALE_DATE DATETIME,
PRIMARY KEY (CUST_ID, ORDER_ID)
);
این جدول در فرم نرمال اول قرار دارد، زیرا تمام قواعد 1NF را رعایت میکند. کلید اصلی از CUST_ID و ORDER_ID تشکیل شده و ترکیب آنها یکتاست.
با این حال جدول در فرم نرمال دوم نیست، زیرا میان بخشهایی از کلید اصلی و برخی ستونها وابستگی جزئی وجود دارد. CUST_NAME به CUST_ID وابسته است و ارتباط مستقیمی با کالای خریداریشده ندارد. جزئیات سفارش و تاریخ خرید نیز به ORDER_ID وابستهاند، نه به CUST_ID.
برای سازگار کردن جدول با 2NF باید ستونها را در سه جدول جدا کرد.
ابتدا جدولی برای جزئیات مشتری ایجاد کنید:
CREATE TABLE CUSTOMERS(
CUST_ID INT NOT NULL,
CUST_NAME VARCHAR (20) NOT NULL,
PRIMARY KEY (CUST_ID)
);
سپس جدولی برای جزئیات هر سفارش:
CREATE TABLE ORDERS(
ORDER_ID INT NOT NULL,
ORDER_DETAIL VARCHAR (20) NOT NULL,
PRIMARY KEY (ORDER_ID)
);
در پایان، جدول سومی ایجاد کنید که فقط CUST_ID و ORDER_ID را نگه دارد تا تمام سفارشهای یک مشتری ردیابی شوند:
CREATE TABLE CUSTMERORDERS(
CUST_ID INT NOT NULL,
ORDER_ID INT NOT NULL,
SALE_DATE DATETIME,
PRIMARY KEY (CUST_ID, ORDER_ID)
);
فرم نرمال سوم (3NF)
یک جدول زمانی در فرم نرمال سوم است که شرایط زیر برقرار باشند:
- در فرم نرمال دوم باشد.
- تمام فیلدهای غیرکلیدی به کلید اصلی وابسته باشند.
وابستگی فیلدهای غیرکلیدی میان دادهها دیده میشود. برای نمونه، در جدول زیر نام خیابان، شهر و ایالت به کد پستی وابستگی جداییناپذیر دارند:
CREATE TABLE CUSTOMERS(
CUST_ID INT NOT NULL,
CUST_NAME VARCHAR (20) NOT NULL,
DOB DATE,
STREET VARCHAR(200),
CITY VARCHAR(100),
STATE VARCHAR(100),
ZIP VARCHAR(12),
EMAIL_ID VARCHAR(256),
PRIMARY KEY (CUST_ID)
);
وابستگی میان کد پستی و نشانی «وابستگی تعدی» نامیده میشود. برای رعایت 3NF کافی است فیلدهای خیابان، شهر و ایالت را به جدول مستقلی مانند جدول کد پستی منتقل کنید:
CREATE TABLE ADDRESS(
ZIP VARCHAR(12),
STREET VARCHAR(200),
CITY VARCHAR(100),
STATE VARCHAR(100),
PRIMARY KEY (ZIP)
);
سپس جدول CUSTOMERS را به شکل زیر تنظیم کنید:
CREATE TABLE CUSTOMERS(
CUST_ID INT NOT NULL,
CUST_NAME VARCHAR (20) NOT NULL,
DOB DATE,
ZIP VARCHAR(12),
EMAIL_ID VARCHAR(256),
PRIMARY KEY (CUST_ID)
);
حذف وابستگیهای تعدی دو مزیت اصلی دارد. نخست اینکه مقدار تکرار داده کاهش مییابد و در نتیجه پایگاه داده کوچکتر میشود.
مزیت دوم یکپارچگی داده است. وقتی دادهٔ تکراری تغییر میکند، خطر آن وجود دارد که فقط بخشی از نسخههای داده بهروزرسانی شوند، بهخصوص اگر همان داده در نقاط مختلف پایگاه داده پراکنده باشد. برای مثال، اگر دادهٔ نشانی و کد پستی در سه یا چهار جدول ذخیره شده باشد، هر تغییر در کدهای پستی باید در تمام رکوردهای آن جدولها اعمال شود.