PDA

View Full Version : ارتباطات جداول و كنترل جامعيت در ديتا بيس



mirhosseini-2014
چهارشنبه 05 شهریور 1393, 20:24 عصر
با سلام
در پروژه ام جداول عضو و كتاب را دارم كه ارتباطات اپلود و دانلود و افزودن نقد براي عضو و كتاب وجود دارد و به دليل چند به چند بودن براي ارتباطات دانلود و افزودن نقد هر كدام از اين ها جدول ديگري را هم مي خواهند و فقط از خود ويژوال استوديو استفاده مي كنم
١ ايجاد ارتباطات زمان ايجاد جداول وبا كمك تعريف كليد هاي خارجي و inner join صورت گيرد ؟
٢ چطور مي توانم با كدنويسي جامعيت ارجاعي را روي cascade در نظر بگيرم ؟
مي خواهم امكان حذف و ويرايش براي نقد و كتاب و عضو باشد اگر راه ديگري دارد چيست ؟
٣ ارتباط بين سه جدول مثلا عضو و كتاب و نقد را براي گزارش گيري ها يا درج و ويرايش چطور مديريت كنم ؟
مثلا مي خواهم هر كاربري روي يك كتاب فقط بتواند يك بار نقد بنويسد
يا كتابي كه يك عضو اپلود كرده را عضو ديگر نتواند اپلود كند
يا ...

ممنون مي شوم اگر با توضيح يا مثال مرا راهنمايي كنيد
يا حتي نمونه كد يا پروژه اي كه به تحليل بهتر كمكم كند
با سپاس از راهنمايي شما

mohammad reza beizavi
دوشنبه 17 شهریور 1393, 00:19 صبح
سلام
شما می خواید یک سایت یا یه نرم افزار داشته باشید که کاربران یا همون اعضا بتونند کتاب آپلود کنند. بعد دیگر اعضا بتونند کتاب رو نقد کنند.
پس اولین موجودیتی که لازم دارید کتاب هست، پس یه جدول برای نگهداری هر کتاب با تمام مشخصاتش لازم دارید و فرض می کنیم که اسمش رو books میگذارید. مثلا با ساختار زیر:

123185
توضیحا اینکه یک فیلد با نام ISBN یا شابک در جدول هست که به عنوان شناسه هر کتاب در دنیا محسوب شده و یکتا است و به عنوان یکی از اهرم ها و یا ابزاری است که می توانید برای جلوگیری از آپلود دوباره یک کتاب ازش استفاده کنید. (البته این برای کتابهاییه که به چاپ رسمی رسیده)
فیلد FilePath برای نگهداری مسیر فایل کتاب آپلود شده هست. یعنی شما فایلها رو از کاربر می گیرید و هر جا خواستید ذخیره می کنید و مسیرش رو توی این فیلد دخیره می کنید.
فیلد Confirmed هم برای این هست که مدیر سایت یا برنامه بتونه کتابها رو بررسی و تایید کنه و IsActive هم می تونه برای فعال و یا غیر فعال کردن کتاب بعد از تایید ازش استفاده کنید.
بقیه فیلدها هم که مشخصه.
دومین موجودیت مهم و حیاتی سیستم شما اعضا هستند. پس برای این موجودیت نیز حداقل یک جدول لازم دارید. اما بهتر است با توجه به گستردگی کارتان از جداول بیشتری استفاده نمایید. مثلا یک جدول برای نگهداری مشخصات عمومی اشخاص و یک جدول نیز برای نگهداری مشخصات کاربری اعضا در نظر بگیرید و با ارتباز دادن آنها از این جداول استفاده نمایید.
شاید بتوانید از ساختار زیر استفاده نمایید:

123186

حال به سراغ دیگر موجودیتهای سیستم برویم؛ شما یک کار اساسی در سیستم دارید و آن هم آپلود کردن کتابها است و مسلما اطلاعات زیادی از این کار لازم خواهید داشت. پس یک جدول نیز برای آن در نطر بگیرید که می تواند با اعضا رابطه چند به چند داشته باشد. پس جدول مورد نظر می تواند به عنوان یک جدول واسط با چند مشخصه منحصر به فرد برای آپلود باشد. مانند زیر:
123187
موجودیت دیگر سیستم را می توان نقد یا یادداشت گذاشتن برای هر کتاب دانست که هر عضو می تواند برای هر کتاب نهایتا یک نظر یا نقد بگذارد. پس همانند موجودیت قبلی یک جدول برایش در نظر بگیرید و با توجه به اینکه می خواهید هر کاربر برای هر کتاب تنها یک نظر بگذارد دو فیلد کلید خارجی که از دو جدول Books و Users می آیند را به عنوان یک کلید اصلی تعریف کنید تا نتوان بیش از یک کاربر و یک کتاب را در این جدول ثبت کرد. برای اینکه دو فیلد را به عنوان کلید اصلی در نظر بگیرید کافیست دو فیلد را انتخاب کرده و روی کلید اصلی کلیک کنید. مانند شکل زیر:
123188
این یک شمای کلی از کاری که می خواید انجام بدید.
فایل اسکریپت دیتابیس رو میذارم شاید بشه استفاده کنید.

راهنمایی: برای کاری که می خواید انجام بدید پله اول رو بردارید، هرجا به مشکل برخوردید از بقیه بپرسید. اینجور به راهنمایی بقیه عادت نمی کنید و از نوآوری خودتون هم می تونید استفاده کنید.
در ضمن سوالاتتون خیلی کلی و مسلما به نتیجه دلخواهتون نمی رسید اینجوری...
موفق باشید.

mohammad reza beizavi
دوشنبه 17 شهریور 1393, 00:20 صبح
اینم سورس کد بانک اطلاعاتی:

USE [master]
GO
/****** Object: Database [TestForBarnamenevisORG] Script Date: 9/8/2014 12:54:06 AM ******/
CREATE DATABASE [TestForBarnamenevisORG]
CONTAINMENT = NONE
ON PRIMARY
( NAME = N'TestForBarnamenevisORG', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\TestForBarna menevisORG.mdf' , SIZE = 5120KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
LOG ON
( NAME = N'TestForBarnamenevisORG_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\TestForBarna menevisORG_log.ldf' , SIZE = 2048KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
GO
ALTER DATABASE [TestForBarnamenevisORG] SET COMPATIBILITY_LEVEL = 120
GO
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [TestForBarnamenevisORG].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO
ALTER DATABASE [TestForBarnamenevisORG] SET ANSI_NULL_DEFAULT OFF
GO
ALTER DATABASE [TestForBarnamenevisORG] SET ANSI_NULLS OFF
GO
ALTER DATABASE [TestForBarnamenevisORG] SET ANSI_PADDING OFF
GO
ALTER DATABASE [TestForBarnamenevisORG] SET ANSI_WARNINGS OFF
GO
ALTER DATABASE [TestForBarnamenevisORG] SET ARITHABORT OFF
GO
ALTER DATABASE [TestForBarnamenevisORG] SET AUTO_CLOSE OFF
GO
ALTER DATABASE [TestForBarnamenevisORG] SET AUTO_SHRINK OFF
GO
ALTER DATABASE [TestForBarnamenevisORG] SET AUTO_UPDATE_STATISTICS ON
GO
ALTER DATABASE [TestForBarnamenevisORG] SET CURSOR_CLOSE_ON_COMMIT OFF
GO
ALTER DATABASE [TestForBarnamenevisORG] SET CURSOR_DEFAULT GLOBAL
GO
ALTER DATABASE [TestForBarnamenevisORG] SET CONCAT_NULL_YIELDS_NULL OFF
GO
ALTER DATABASE [TestForBarnamenevisORG] SET NUMERIC_ROUNDABORT OFF
GO
ALTER DATABASE [TestForBarnamenevisORG] SET QUOTED_IDENTIFIER OFF
GO
ALTER DATABASE [TestForBarnamenevisORG] SET RECURSIVE_TRIGGERS OFF
GO
ALTER DATABASE [TestForBarnamenevisORG] SET DISABLE_BROKER
GO
ALTER DATABASE [TestForBarnamenevisORG] SET AUTO_UPDATE_STATISTICS_ASYNC OFF
GO
ALTER DATABASE [TestForBarnamenevisORG] SET DATE_CORRELATION_OPTIMIZATION OFF
GO
ALTER DATABASE [TestForBarnamenevisORG] SET TRUSTWORTHY OFF
GO
ALTER DATABASE [TestForBarnamenevisORG] SET ALLOW_SNAPSHOT_ISOLATION OFF
GO
ALTER DATABASE [TestForBarnamenevisORG] SET PARAMETERIZATION SIMPLE
GO
ALTER DATABASE [TestForBarnamenevisORG] SET READ_COMMITTED_SNAPSHOT OFF
GO
ALTER DATABASE [TestForBarnamenevisORG] SET HONOR_BROKER_PRIORITY OFF
GO
ALTER DATABASE [TestForBarnamenevisORG] SET RECOVERY FULL
GO
ALTER DATABASE [TestForBarnamenevisORG] SET MULTI_USER
GO
ALTER DATABASE [TestForBarnamenevisORG] SET PAGE_VERIFY CHECKSUM
GO
ALTER DATABASE [TestForBarnamenevisORG] SET DB_CHAINING OFF
GO
ALTER DATABASE [TestForBarnamenevisORG] SET FILESTREAM( NON_TRANSACTED_ACCESS = OFF )
GO
ALTER DATABASE [TestForBarnamenevisORG] SET TARGET_RECOVERY_TIME = 0 SECONDS
GO
ALTER DATABASE [TestForBarnamenevisORG] SET DELAYED_DURABILITY = DISABLED
GO
EXEC sys.sp_db_vardecimal_storage_format N'TestForBarnamenevisORG', N'ON'
GO
USE [TestForBarnamenevisORG]
GO
/****** Object: Table [dbo].[Books] Script Date: 9/8/2014 12:54:06 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Books](
[Id] [int] IDENTITY(1,1) NOT NULL,
[ISBN] [nvarchar](50) NULL,
[Name] [nvarchar](50) NULL,
[PublishedDate] [datetime] NULL,
[Author] [nvarchar](50) NULL,
[FilePath] [nvarchar](500) NULL,
[Confirmed] [bit] NULL,
[IsActive] [bit] NULL,
[Language] [nvarchar](50) NULL,
CONSTRAINT [PK_Books] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
/****** Object: Table [dbo].[BooksOfUsers] Script Date: 9/8/2014 12:54:06 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[BooksOfUsers](
[UserId] [int] NOT NULL,
[BookId] [int] NOT NULL,
[UploadDate] [datetime] NULL,
[FileUploadType] [nvarchar](50) NULL
) ON [PRIMARY]

GO
/****** Object: Table [dbo].[BooksReview] Script Date: 9/8/2014 12:54:06 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[BooksReview](
[BookId] [int] NOT NULL,
[UserId] [int] NOT NULL,
[ReviewDate] [datetime] NULL,
[Comment] [nvarchar](max) NULL,
CONSTRAINT [PK_BooksReview] PRIMARY KEY CLUSTERED
(
[BookId] ASC,
[UserId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO
/****** Object: Table [dbo].[Persons] Script Date: 9/8/2014 12:54:06 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Persons](
[Id] [int] NOT NULL,
[FirstName] [nvarchar](50) NULL,
[LastName] [nvarchar](50) NULL,
[Birthday] [datetime] NULL,
[NationalCode] [nvarchar](10) NULL,
[PhoneNumber] [nvarchar](12) NULL,
[MobileNumber] [nvarchar](12) NULL,
CONSTRAINT [PK_Persons] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
/****** Object: Table [dbo].[Users] Script Date: 9/8/2014 12:54:06 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Users](
[Id] [int] NOT NULL,
[PersonId] [int] NULL,
[UserName] [nvarchar](50) NULL,
[Password] [nvarchar](50) NULL,
CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
ALTER TABLE [dbo].[BooksOfUsers] WITH CHECK ADD CONSTRAINT [FK_BooksOfUsers_Books] FOREIGN KEY([BookId])
REFERENCES [dbo].[Books] ([Id])
ON UPDATE CASCADE
GO
ALTER TABLE [dbo].[BooksOfUsers] CHECK CONSTRAINT [FK_BooksOfUsers_Books]
GO
ALTER TABLE [dbo].[BooksOfUsers] WITH CHECK ADD CONSTRAINT [FK_BooksOfUsers_Users] FOREIGN KEY([UserId])
REFERENCES [dbo].[Users] ([Id])
ON UPDATE CASCADE
GO
ALTER TABLE [dbo].[BooksOfUsers] CHECK CONSTRAINT [FK_BooksOfUsers_Users]
GO
ALTER TABLE [dbo].[BooksReview] WITH CHECK ADD CONSTRAINT [FK_BooksReview_Books] FOREIGN KEY([BookId])
REFERENCES [dbo].[Books] ([Id])
ON UPDATE CASCADE
GO
ALTER TABLE [dbo].[BooksReview] CHECK CONSTRAINT [FK_BooksReview_Books]
GO
ALTER TABLE [dbo].[BooksReview] WITH CHECK ADD CONSTRAINT [FK_BooksReview_Users] FOREIGN KEY([UserId])
REFERENCES [dbo].[Users] ([Id])
ON UPDATE CASCADE
GO
ALTER TABLE [dbo].[BooksReview] CHECK CONSTRAINT [FK_BooksReview_Users]
GO
ALTER TABLE [dbo].[Users] WITH CHECK ADD CONSTRAINT [FK_Users_Persons] FOREIGN KEY([PersonId])
REFERENCES [dbo].[Persons] ([Id])
ON UPDATE CASCADE
GO
ALTER TABLE [dbo].[Users] CHECK CONSTRAINT [FK_Users_Persons]
GO
USE [master]
GO
ALTER DATABASE [TestForBarnamenevisORG] SET READ_WRITE
GO