مفاهیم RDBMS، نرمال‌سازی، سامانه‌های پایگاه داده و انواع داده در SQL

مفاهیم RDBMS، نرمال‌سازی، سامانه‌های پایگاه داده و انواع داده در SQL

توسط admin | گروه SQL Server | 1405/05/22

نظرات 0

مفاهیم RDBMS، نرمال‌سازی، سامانه‌های پایگاه داده و انواع داده در SQL

فصل ۲ — مفاهیم 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)
);

حذف وابستگی‌های تعدی دو مزیت اصلی دارد. نخست اینکه مقدار تکرار داده کاهش می‌یابد و در نتیجه پایگاه داده کوچک‌تر می‌شود.

مزیت دوم یکپارچگی داده است. وقتی دادهٔ تکراری تغییر می‌کند، خطر آن وجود دارد که فقط بخشی از نسخه‌های داده به‌روزرسانی شوند، به‌خصوص اگر همان داده در نقاط مختلف پایگاه داده پراکنده باشد. برای مثال، اگر دادهٔ نشانی و کد پستی در سه یا چهار جدول ذخیره شده باشد، هر تغییر در کدهای پستی باید در تمام رکوردهای آن جدول‌ها اعمال شود.

فصل ۳ — پایگاه‌های دادهٔ RDBMS مبتنی بر SQL

RDBMSهای محبوب زیادی برای کار وجود دارند. این آموزش مروری کوتاه بر چند نمونهٔ پرکاربرد ارائه می‌کند تا مقایسهٔ ویژگی‌های پایهٔ آن‌ها آسان‌تر شود.

MySQL

MySQL یک پایگاه دادهٔ SQL متن‌باز است که توسط شرکت سوئدی MySQL AB توسعه داده شد. متن منبع تلفظ آن را «my ess-que-ell» و تلفظ SQL را «sequel» ذکر می‌کند.

MySQL از بسترهای گوناگون از جمله Microsoft Windows، توزیع‌های اصلی Linux، UNIX و Mac OS X پشتیبانی می‌کند.

MySQL بسته به نوع استفاده و امکانات، نسخه‌های رایگان و پولی داشته است. سرور پایگاه دادهٔ آن در متن منبع سریع، چندریسمانی، چندکاربره و مقاوم توصیف شده است.

تاریخچه

  • ۱۹۹۴ — آغاز توسعهٔ MySQL توسط Michael Widenius و David Axmark.
  • ۲۳ مه ۱۹۹۵ — نخستین انتشار داخلی.
  • ۸ ژانویهٔ ۱۹۹۸ — انتشار نسخهٔ Windows برای Windows 95 و NT.
  • نسخهٔ 3.23 — بتا از ژوئن ۲۰۰۰ و انتشار تولیدی در ژانویهٔ ۲۰۰۱.
  • نسخهٔ 4.0 — بتا از اوت ۲۰۰۲ و انتشار تولیدی در مارس ۲۰۰۳؛ با پشتیبانی از Union.
  • نسخهٔ 4.01 — بتا از اوت ۲۰۰۳؛ متن منبع اشاره می‌کند که Jyoti از MySQL برای ردیابی پایگاه داده استفاده کرد.
  • نسخهٔ 4.1 — بتا از ژوئن ۲۰۰۴ و انتشار تولیدی در اکتبر ۲۰۰۴.
  • نسخهٔ 5.0 — بتا از مارس ۲۰۰۵ و انتشار تولیدی در اکتبر ۲۰۰۵.
  • ۲۶ فوریهٔ ۲۰۰۸ — خرید MySQL AB توسط Sun Microsystems.
  • ۲۷ نوامبر ۲۰۰۸ — انتشار تولیدی نسخهٔ 5.1.

ویژگی‌ها

  • Performance (کارایی) بالا.
  • دسترس‌پذیری بالا.
  • مقیاس‌پذیری و انعطاف‌پذیری.
  • پشتیبانی قدرتمند از تراکنش‌ها.
  • توانمندی در وب و انبار داده.
  • محافظت قوی از داده.
  • امکانات جامع توسعهٔ برنامه.
  • سهولت مدیریت.
  • آزادی متن‌باز و پشتیبانی ۲۴×۷.
  • هزینهٔ کل مالکیت پایین.

MS SQL Server

MS SQL Server یک سامانهٔ مدیریت پایگاه دادهٔ رابطه‌ای است که توسط Microsoft توسعه داده شده است. زبان‌های اصلی پرس‌وجوی ذکرشده در متن عبارت‌اند از:

  • T-SQL
  • ANSI SQL

تاریخچه

  • ۱۹۸۷ — Sybase نسخهٔ SQL Server برای UNIX را منتشر کرد.
  • ۱۹۸۸ — Microsoft، Sybase و Aston-Tate، SQL Server را به OS/2 منتقل کردند.
  • ۱۹۸۹ — Microsoft، Sybase و Aston-Tate، SQL Server 1.0 را برای OS/2 منتشر کردند.
  • ۱۹۹۰ — SQL Server 1.1 با پشتیبانی از کلاینت‌های Windows 3.0 منتشر شد.
  • Aston-Tate از توسعهٔ SQL Server کنار رفت.
  • ۲۰۰۰ — Microsoft، SQL Server 2000 را منتشر کرد.
  • ۲۰۰۱ — Microsoft، محصول XML for SQL Server Web Release 1 را منتشر کرد.
  • ۲۰۰۲ — Microsoft، SQLXML 2.0 را منتشر کرد که نام آن از XML for SQL Server تغییر کرده بود.
  • ۲۰۰۲ — Microsoft، SQLXML 3.0 را منتشر کرد.
  • ۷ نوامبر ۲۰۰۵ — Microsoft، SQL Server 2005 را منتشر کرد.

ویژگی‌ها

  • Performance (کارایی) بالا.
  • دسترس‌پذیری بالا.
  • Database Mirroring (آینه‌سازی پایگاه داده).
  • Database Snapshot (تصویر لحظه‌ای پایگاه داده).
  • یکپارچه‌سازی CLR.
  • Service Broker.
  • تریگرهای DDL.
  • توابع رتبه‌بندی.
  • سطوح جداسازی مبتنی بر نسخهٔ سطر.
  • یکپارچه‌سازی XML.
  • TRY...CATCH.
  • Database Mail.

Oracle

Oracle یک سامانهٔ مدیریت پایگاه دادهٔ بسیار بزرگ و چندکاربره و یک RDBMS توسعه‌یافته توسط Oracle Corporation است.

Oracle برای مدیریت کارآمد منبع اطلاعاتی خود، یعنی پایگاه داده، میان چندین کلاینت که در شبکه داده درخواست یا ارسال می‌کنند طراحی شده است.

متن منبع Oracle را گزینه‌ای مناسب برای رایانش کلاینت/سرور معرفی می‌کند و پشتیبانی آن از سیستم‌عامل‌های مهم کلاینت و سرور، از جمله MSDOS، NetWare، UnixWare، OS/2 و گونه‌های مختلف UNIX را ذکر می‌کند.

تاریخچه

Oracle در سال ۱۹۷۷ آغاز شد و متن منبع دورهٔ ۱۹۷۷ تا ۲۰۰۹ را ۳۲ سال فعالیت آن در صنعت می‌داند.

  • ۱۹۷۷ — Larry Ellison، Bob Miner و Ed Oates شرکت Software Development Laboratories را برای انجام کارهای توسعه‌ای بنیان گذاشتند.
  • ۱۹۷۹ — نسخهٔ 2.0 Oracle منتشر شد و طبق متن منبع به نخستین پایگاه دادهٔ رابطه‌ای تجاری و نخستین پایگاه دادهٔ SQL تبدیل شد. نام شرکت به Relational Software Inc. (RSI) تغییر یافت.
  • ۱۹۸۱ — RSI توسعهٔ ابزارهای Oracle را آغاز کرد.
  • ۱۹۸۲ — RSI به Oracle Corporation تغییر نام داد.
  • ۱۹۸۳ — نسخهٔ 3.0 Oracle که با زبان C بازنویسی شده بود و روی چند بستر اجرا می‌شد منتشر شد.
  • ۱۹۸۴ — نسخهٔ 4.0 Oracle منتشر شد و قابلیت‌هایی مانند کنترل هم‌زمانی و سازگاری خواندن چندنسخه‌ای داشت.
  • ۱۹۸۵ — متن منبع بار دیگر انتشار نسخهٔ 4.0 و امکانات کنترل هم‌زمانی و سازگاری خواندن چندنسخه‌ای را ذکر می‌کند.
  • ۲۰۰۷ — Oracle11g منتشر شد و تمرکز نسخهٔ جدید بر پارتیشن‌بندی بهتر و مهاجرت آسان‌تر ذکر شده است.

ویژگی‌ها

  • هم‌زمانی.
  • سازگاری خواندن.
  • سازوکارهای قفل‌گذاری.
  • Quiesce Database.
  • قابلیت حمل.
  • پایگاه دادهٔ خودمدیریت.
  • SQL*Plus.
  • ASM.
  • زمان‌بند.
  • Resource Manager.
  • انبار داده.
  • Viewهای مادی‌شده.
  • ایندکس‌های Bitmap.
  • فشرده‌سازی جدول.
  • اجرای موازی.
  • Analytic SQL.
  • داده‌کاوی.
  • پارتیشن‌بندی.

Microsoft Access

Microsoft Access یکی از محصولات شناخته‌شدهٔ Microsoft و یک نرم‌افزار مدیریت پایگاه دادهٔ سطح ورودی است. پایگاه دادهٔ MS Access افزون بر هزینهٔ پایین، برای پروژه‌های کوچک نیز توانمند است.

MS Access از موتور پایگاه دادهٔ Jet استفاده می‌کند که گویش مشخصی از SQL، گاهی با نام Jet SQL، را به‌کار می‌گیرد.

MS Access همراه نسخهٔ حرفه‌ای مجموعهٔ MS Office عرضه شده و رابط گرافیکی شهودی و ساده‌ای دارد.

  • ۱۹۹۲ — انتشار Access 1.0.
  • ۱۹۹۳ — انتشار Access 1.1 برای بهبود سازگاری، همراه با زبان برنامه‌نویسی Access Basic.
  • متن منبع گذار از Access 97 به Access 2000 را مهم‌ترین انتقال می‌داند.
  • ۲۰۰۷ — در Access 2007 قالب پایگاه دادهٔ جدید ACCDB معرفی شد که انواع دادهٔ پیچیده مانند فیلدهای چندمقداری و پیوست را پشتیبانی می‌کرد.

ویژگی‌ها

  • کاربران می‌توانند جدول، پرس‌وجو، فرم و گزارش ایجاد کنند و آن‌ها را با ماکروها به هم متصل کنند.
  • امکان واردکردن و صادرکردن داده در قالب‌های گوناگون از جمله Excel، Outlook، ASCII، dBase، Paradox، FoxPro، SQL Server، Oracle و ODBC.
  • قالب Jet Database با پسوند MDB یا ACCDB در Access 2007 می‌تواند برنامه و داده را در یک فایل نگه دارد؛ بنابراین توزیع کامل برنامه برای کاربری دیگر که در محیط بدون اتصال اجرا می‌کند آسان است.
  • Microsoft Access از پرس‌وجوهای پارامتری پشتیبانی می‌کند. این پرس‌وجوها و جدول‌های Access می‌توانند از برنامه‌های دیگری مانند VB6 و .NET از طریق DAO یا ADO مورد ارجاع قرار گیرند.
  • نسخه‌های دسکتاپ Microsoft SQL Server می‌توانند همراه Access به‌عنوان جایگزینی برای Jet Database Engine استفاده شوند.
  • Microsoft Access یک پایگاه دادهٔ مبتنی بر فایل‌سرور است. برخلاف سامانه‌های مدیریت پایگاه دادهٔ رابطه‌ای کلاینت/سرور، طبق متن منبع Access تریگر پایگاه داده، Stored Procedure (رویهٔ ذخیره‌شده) یا ثبت تراکنش را پیاده‌سازی نمی‌کند.

فصل ۴ — نحو SQL

SQL مجموعه‌ای از قواعد و دستورالعمل‌های ویژه دارد که «نحو» نامیده می‌شوند. در این بخش، نحو پایهٔ SQL به‌صورت فشرده معرفی می‌شود.

دستورهای SQL با کلیدواژه‌هایی مانند SELECT، INSERT، UPDATE، DELETE، ALTER، DROP، CREATE، USE و SHOW آغاز می‌شوند و دستورها با نقطه‌ویرگول (;) پایان می‌یابند.

نکتهٔ مهم این است که SQL نسبت به بزرگی و کوچکی حروف حساس نیست؛ بنابراین SELECT و select در دستورهای SQL معنای یکسانی دارند. با این حال، متن منبع یادآوری می‌کند که MySQL می‌تواند در نام جدول‌ها تفاوت قائل شود؛ بنابراین نام جدول باید مطابق آنچه در پایگاه داده وجود دارد نوشته شود.

دستور SELECT

SELECT column1, column2....columnN
FROM   table_name;

عبارت DISTINCT

SELECT DISTINCT column1, column2....columnN
FROM   table_name;

عبارت WHERE

SELECT column1, column2....columnN
FROM   table_name
WHERE  CONDITION;

عبارت AND/OR

SELECT column1, column2....columnN
FROM   table_name
WHERE  CONDITION-1 {AND|OR} CONDITION-2;

عبارت IN

SELECT column1, column2....columnN
FROM   table_name
WHERE  column_name IN (val-1, val-2,...val-N);

عبارت BETWEEN

SELECT column1, column2....columnN
FROM   table_name
WHERE  column_name BETWEEN val-1 AND val-2;

عبارت LIKE

SELECT column1, column2....columnN
FROM   table_name
WHERE  column_name LIKE { PATTERN };

عبارت ORDER BY

SELECT column1, column2....columnN
FROM   table_name
WHERE  CONDITION
ORDER BY column_name {ASC|DESC};

عبارت GROUP BY

SELECT SUM(column_name)
FROM   table_name
WHERE  CONDITION
GROUP BY column_name;

عبارت COUNT

SELECT COUNT(column_name)
FROM   table_name
WHERE  CONDITION;

عبارت HAVING

SELECT SUM(column_name)
FROM   table_name
WHERE  CONDITION
GROUP BY column_name
HAVING (arithematic function condition);

دستور CREATE TABLE

CREATE TABLE table_name(
column1 datatype,
column2 datatype,
column3 datatype,
.....
columnN datatype,
PRIMARY KEY( one or more columns )
);

دستور DROP TABLE

DROP TABLE table_name;

دستور CREATE INDEX

CREATE UNIQUE INDEX index_name
ON table_name ( column1, column2,...columnN);

دستور DROP INDEX

ALTER TABLE table_name
DROP INDEX index_name;

دستور DESC

DESC table_name;

دستور TRUNCATE TABLE

TRUNCATE TABLE table_name;

دستور ALTER TABLE

ALTER TABLE table_name {ADD|DROP|MODIFY} column_name {data_ype};

تغییر نام جدول با ALTER TABLE

ALTER TABLE table_name RENAME TO new_table_name;

دستور INSERT INTO

INSERT INTO table_name( column1, column2....columnN)
VALUES ( value1, value2....valueN);

دستور UPDATE

UPDATE table_name
SET column1 = value1, column2 = value2....columnN=valueN
[ WHERE  CONDITION ];

دستور DELETE

DELETE FROM table_name
WHERE  {CONDITION};

دستور CREATE DATABASE

CREATE DATABASE database_name;

دستور DROP DATABASE

DROP DATABASE database_name;

دستور USE

USE DATABASE database_name;

دستور COMMIT

COMMIT;

دستور ROLLBACK

ROLLBACK;

فصل ۵ — انواع داده در SQL

نوع داده در SQL ویژگی‌ای است که نوع دادهٔ یک شیء را مشخص می‌کند. هر ستون، متغیر و عبارت در SQL نوع دادهٔ مرتبط با خود دارد.

هنگام ایجاد جدول‌ها از این انواع داده استفاده می‌شود و نوع دادهٔ هر ستون بر اساس نیاز انتخاب می‌شود.

متن منبع شش دسته از انواع دادهٔ SQL Server را معرفی می‌کند.

انواع عددی دقیق

نوع دادهازتا
Bigint-9,223,372,036,854,775,8089,223,372,036,854,775,807
Int-2,147,483,6482,147,483,647
Smallint-32,76832,767
Tinyint0255
Bit01
Decimal-10^38 +110^38 -1
Numeric-10^38 +110^38 -1
Money-922,337,203,685,477.5808+922,337,203,685,477.5807
Smallmoney-214,748.3648+214,748.3647

انواع عددی تقریبی

نوع دادهازتا
Float-1.79E + 3081.79E + 308
Real-3.40E + 383.40E + 38

انواع تاریخ و زمان

نوع دادهازتا / توضیح
Datetime۱ ژانویهٔ ۱۷۵۳۳۱ دسامبر ۹۹۹۹
Smalldatetime۱ ژانویهٔ ۱۹۰۰۶ ژوئن ۲۰۷۹
Dateتاریخی مانند ۳۰ ژوئن ۱۹۹۱ را ذخیره می‌کند.
Timeزمانی از روز مانند ۱۲:۳۰ بعدازظهر را ذخیره می‌کند.

انواع رشتهٔ نویسه‌ای

نوع دادهتوضیح
Charحداکثر طول ۸٬۰۰۰ نویسه؛ نویسه‌های غیر Unicode با طول ثابت.
Varcharحداکثر ۸٬۰۰۰ نویسه؛ دادهٔ غیر Unicode با طول متغیر.
varchar(max)طبق متن منبع حداکثر طول 2^31 نویسه؛ دادهٔ غیر Unicode با طول متغیر، فقط SQL Server 2005.
Textدادهٔ غیر Unicode با طول متغیر و حداکثر ۲٬۱۴۷٬۴۸۳٬۶۴۷ نویسه.

انواع رشتهٔ نویسه‌ای Unicode

نوع دادهتوضیح
Ncharحداکثر ۴٬۰۰۰ نویسه؛ Unicode با طول ثابت.
Nvarcharحداکثر ۴٬۰۰۰ نویسه؛ Unicode با طول متغیر.
nvarchar(max)طبق متن منبع حداکثر طول 2^31 نویسه؛ Unicode با طول متغیر، فقط SQL Server 2005.
Ntextحداکثر ۱٬۰۷۳٬۷۴۱٬۸۲۳ نویسه؛ Unicode با طول متغیر.

انواع دادهٔ دودویی

نوع دادهتوضیح
Binaryحداکثر ۸٬۰۰۰ بایت؛ دادهٔ دودویی با طول ثابت.
Varbinaryحداکثر ۸٬۰۰۰ بایت؛ دادهٔ دودویی با طول متغیر.
varbinary(max)طبق متن منبع حداکثر طول 2^31 بایت؛ دادهٔ دودویی با طول متغیر، فقط SQL Server 2005.
Imageحداکثر ۲٬۱۴۷٬۴۸۳٬۶۴۷ بایت؛ دادهٔ دودویی با طول متغیر.

انواع دادهٔ متفرقه

نوع دادهتوضیح
sql_variantمقادیر انواع دادهٔ پشتیبانی‌شدهٔ SQL Server را، به‌جز text، ntext و timestamp، ذخیره می‌کند.
timestampیک عدد یکتای سراسری در پایگاه داده را ذخیره می‌کند که هر بار سطری به‌روزرسانی شود تغییر می‌کند.
uniqueidentifierیک شناسهٔ یکتای سراسری (GUID) را ذخیره می‌کند.
xmlدادهٔ XML را ذخیره می‌کند. می‌توان نمونه‌های XML را در ستون یا متغیر ذخیره کرد؛ طبق متن منبع فقط SQL Server 2005.
cursorارجاع به یک شیء Cursor (مکان‌نما).
tableیک مجموعه‌نتیجه را برای پردازش بعدی ذخیره می‌کند.

امتیاز کاربران به این مقاله

☆☆☆☆☆

0 نفر امتیاز داده اند. میانگین: 0.0 از 5

 

0 نظر

نظر محترم شما در مورد مقاله های وب سایت برنامه نویسی و پایگاه داده

نظرات محترم شما در خدمات رسانی بهتر ما را یاری می نمایند. لطفا اگر مایل بودید یک نظر ما را مهمان فرمائید. آدرس ایمیل و وب سایت شما نمایش داده نخواهد شد.

0 / 500

اطلاعات تماس

  • آدرس:اصفهان-خیابان ام کلثوم غربی - بعد خیابان تخم چی - بیست متر بعد از پیتزا ننه شب - کوچه تعمیر گاه سمار زغالی - پلاک 354 - درب مشکی - طبقه هفتم
  • آدرس ایمیل:najafzade@gmail.com
  • وب سایت:http://www.a00b.com/
  • تلفن ثابت:(+98)9131253620
  • تلفن همراه:09131253620