1) Tutarlı ve iyi tanımlanmış tablo/sütun isimleri kullanın. ( Okul, Ogrenci, KursNO)
2) Tablo isimleri için çoğul isimler kullanmayın ( Ogrenci/Ogrenciler Student/Students) Tablolar zaten varlık koleksiyonlarını içerirler çoğul kullanmanıza gerek yoktur.
3) Tablo isimlerinde boşluk karakteri kullanmayın. Eğer kullanırsanız veritabanı sunucusu tipine göre sorgularınızda köşeli parantez, süslü parantez gibi ekstra ifadeler kullanmak zorunda kalabilirsiniz bu da kodlama sırasında hatalar yapmanıza sebep olabilir.
4) Tablo isimlendirirken gereksiz ön ek ve son eklerden kaçının (tblOgrenci, OgrenciTbl, OgrenciTablosu)
5) Şifre alanlarını kriptolayarak saklayın. (MD5, SHA1, bazı alanlar için base64 v.s.)
6) Bütün tablolarınıza sayı değeri barındıran bir kimlik sütunu bulundurun (Id alanı). Başlangıçta lazım olmasa bile ilerde lazım olma ihtimali yüksektir. Ayrıca bazı ORM araçlarının tablo üzerinde işlem yapmak için benzersiz bir ‘id’ alanına ihtiyaç duyduğunu aklınızda bulundurun.
7) Index oluşturmak için sayı (integer) tipli alanları tercih edin. Karakter (char/varchar) seçmeniz performans problemlerine neden olabilir.
Mantıksal (boolean) veri tipi için ‘bit’ tanımlaması kullanın. Karakter veya sayı kullanmanız gereksiz alan tüketimine sebep olur ayrıca bu alanlar için ‘Is’ öneki kullanabilirsiniz (İngilizce).
9) Veri tabanı için yetkilendirme sistemi kullanın, her kullanıcıya ‘yönetici’ admin rolü vermeyin.
10) Gerekmedikçe tablonuzdaki bütün sütunları seçen, ‘select *’ sorgusundan uzak durun. Sorgunuzda sadece gerekli sütunları isteyin.
11) Uygulamanız büyüdükçe ORM araçları kullanmaya yönelmeseniz. Başlangıçta performans kaybına neden olsa da ince ayar yaparak problemlerin üstesinden gelebilirsiniz.
12) Büyük ölçekli ve fazla kullanılmayan tabloları performans arttırmak amacıyla farklı disklerde tutmaya çalışın.
13) Büyük, hassas ve kritik önemi olan veritabanlarınız için yedekleme ve data güvenlik sistemleri kullanın (failover clustering, auto backups, replications)
14) Data bütünlüğünü sağlamak amacıyla alan kısıtlamalarını kullanın bütün denetleme işini uygulamanıza bırakmayın.
15) Varlık yapınızı, tablo ilişkilerinizi dokümente edin. Kullandığınız tetikleyicilerde (trigger) ve saklı prosedürlerde (stored procedures) yorum satırları ile yaptıklarınızı anlatın.
16) Büyük tablolar üzerinde çok kullandığınız sorgular için indexlemeye gidin. Analiz araçları hangi alanlarda indexlemeye gitmeniz gerektiği konusunda size yardımcı olabilir. Büyük çapta sonuç döndüren sorgular için ‘clustered index’ler, tekil sonuç döndürenler için ise ‘non-clustered’ indexler genellikle daha iyidir.
17) Veritabanı sunucusu ile web sunucusunu (uygulama sunucusu) farklı fiziksel makinalarda tutmaya çalışın. Bu hem performası (farklı cpu ve disk alanı kullanımından dolayı) artırır hem de daha fazla güvenlik sağlar (hack ataklarına karşı)
18) Sık kullanılan tablolarda resim (image) alanına yer vermeniz performans problemlerine sebep olabilir. Bu alanları farklı tablolarda tutmaya çalışın.
19) Gerektiğinde performansı arttırmak için normalizasyon (http://tr.wikipedia.org/wiki/Normalizasyon) yapmalısınız. Normalizasyonun az ya da çok olması performans problemlerine sebep olabilir.
20) Veritabanı modelleme ve tasarımı için daha fazla zaman ayırın. Eğer ayırmazsanız bu sizi bakım işlemleri sırasında aşırı vakit harcamak ve tablolarınızı yeniden dizayn etmek zorunda bırakabilir Orjinal Makale
Orjinal Makale
20 Database Design Best Practices
http://codebalance.blogspot.com/2011/07/20-database-design-best-practices.html
LINQ to SQL in C#
Cheat Sheet http://damieng.com
Data context & database create
var db = new MyDataContext(@”server=.\SQLEXPRESS;database=my;integrated security=SSPI”);
if (!db.DatabaseExists()) db.CreateDatabase();
Where, null, contains & type
var r = new string[] { “WA”, “OR” };
var customers = from c in db.Customers
where c is Customer &&
(c.Region==null || r.Contains(c.Region))
select c;
Insert
var customer = new Customer() {
CustID = “CHIPS”,
CompanyName = “Mr. Chips” };
db.Customers.InsertOnSubmit(customer);
db.SubmitChanges();
Update
customer.ContactName = “Adam”;
customer.Location = null;
db.SubmitChanges();
Select one
var only = db.Customers.SingleOrDefault(c
=> c.CustID == “CHIPS”);
var first = db.Customers.FirstOrDefault(c
=> c.CustID == “CHIPS”);
Paging & order
var page3 = (from c in db.Customers
orderby c.ContactName, c.City descending
select c).Skip(10).Take(5);
Delete
db.Customers.DeleteOnSubmit(customer);
db.SubmitChanges();
Group, count, sum & projection
var totals = from c in db.Customers
group c by c.Country into g
select new Summary { Country = g.Key,
CustomerCount = g.Count(),
OrdCount = g.Sum(a=> a.Orders.Count)};
Join, shape & distinct
var labels = (from c in db.Customers
join o in db.Orders
on c.CustID equals o.CustID
select new { name = c.ContactName,
address = o.ShipAddress
}).Distinct();
Class/table attributes
[Table(Name="dbo.Customers")]
[InheritanceMapping(Code="C",
Type=typeof(Customer), IsDefault=true)]
[InheritanceMapping(Code="T",
Type=typeof(TopCustomer)]
Property/column attributes
[Column(Storage="_CustomerID",
DbType="Int NOT NULL", Name="custid",
IsPrimaryKey=true)]
[Column(Storage="_Category",
DbType="Char(1)",
IsDiscriminator=true)]
[Column(Storage="_Ver", IsVersion=true
AutoSync=AutoSync.Always,
UpdateCheck=UpdateCheck.Never,
DbType="rowversion NOT NULL",
CanBeNull=false, IsDbGenerated=true)]
Association/relationship attributes
[Association(Name="Country_Customer",
Storage="_Country", ThisKey="CoID",
IsForeignKey=true)]
Composite & outer join
var r = from c in db.Customers
join o in db.Orders on
new { c=c.CustID, r=c.Country } equals
new { c=o.CustID, r=o.ShipCountry }
into j
from jo in j.DefaultIfEmpty()
select new { c, jo };
1- Eger kendi servınız var ise yada host aldıgınız yerde web configde ne yaptıysanız olmuyorsa Windows özelliklerinden “HTTP Redirection” yüklü olması gerekli aksi taktirde web configde ne yapsanız boş….
2- iss manager de Aplication Pools da Default App poll Managed Pipeline Mode Integrated olarak ayarlı olacak
3- webconfig dosyanız da bu ayarlar olacak

işte bu kadar …. global asax dosyanızda tanımlamalar dogruysa sorunsuz calisacaktır….
public virtual void Update(T entity)
{
if (_context.ObjectStateManager.GetObjectStateEntry(entity).State== EntityState.Detached)
{
return; //throw new InvalidOperationException(…);
}
_context.SaveChanges();
}
Entity Framework Repository , generic , jenerik yada neyse class tarafındaki update olayı kullanımı hakkında soru sorabilirsiniz…
MSSQL VERİ TİPLERİ
BIGINT:
Açıklama: Int veri tipinin daha geniş bir nümerik aralığa sahip hali.
Minimum Değeri: -9,223,372,036,854,775,808)
Maksimum Değeri: 9,223,372,036,854,775,807
Kapladığı yer: 8 byte
BINARY:
Açıklama: Maksimum 8 (8000 byte) kb boyutunda binary veri alabilen
veri tipi. Parantez içerisinde verinin boyutu belirlenir. ÖRNEK: Binary(4)
gibi
Kapladığı Yer: Değişken
BIT:
Açıklama: Değeri 1,0 ya da Null olabilen veri tipi
Kapladığı yer: 1 byte
CHAR:
Açıklama: Belirtilen sayıda karakter tutbilen veri tipi. Maksiumum 8000
byte (8 kb) olabilir. Char(4) olarak belirtildiğinde her zaman 4 byte’lık yer
ayrılır. Veri girişinde o sütunu boş bıraksanız da 2 karakterlik veri girseniz
de her zaman 4 byte yer tutar. Diyelim sadece bir “a” harfi girdiniz, bu
kayıt “a “ (boşluklara dikkat) olarak kaydedilir. Unicode karakterler
girilemez.
Kapladığı Yer: Değişken
DATETIME:
Açıklama: Saat ve tarih girişi yapılabilen veri tipi. Dikkat: Giriş formatı
bölgelere göre değişiklik gösterir.
Minimum Değeri:1 Ocak 1753
Maksimum Değeri: 31 Aralık 9999
Kapladığı Yer: 8 Bit
DECIMAL:
Açıklama: Ondalıklı rakam girişi yapılabilen veri tipi. Numeric’le aynı
görevi görür. Decimal(Precision,Scale) olarak tanımlanır. Precision:
Rakamın ondalık dahil kaç haneden oluşacağını belirler. Scale ise ondalık
kısmının kaç haneden oluşacağını belirler. Decimal(3,1) dediğimiz zaman
22,1, -22,1 gibiver girişleri yapabiliriz. Eğer 22,12 yazarsak sql server
bunu 22,1’e dönüştürecektir.
Minimum Değeri: -1038-1
Maksimum Değeri: 1038-1
Kapladığı Yer: Değişken
FLOAT:
Açıklama: Ondalıklı rakam girişi yapılabilen veri tipi.
Minimum Değeri: -1.79E + 308
Maksimum Değeri: 1.79E + 308
Kapladığı Yer: 8 Byte
IMAGE:
Açıklama: Binary veri girişi yapılabilen veri tipi
Kapladığı Yer: Maksimum 2 Gigbabyte (2,147,483,647 byte)
INT:
Açıklama: Tam sayı girişi yapılabilen veri tipi
Minimum Değeri: -2,147,483,647
Maksimum Değeri: +2,147,483,647
Kapladığı Yer: 4 byte
MONEY:
Açıklama: Para girişleri için kullanılan veri tipi. Decimal(18,4)’le aynı
görevi görür.
Minimum Değeri: -922,337,203,685,477.5808
Maksimum Değeri: 922,337,203,685,477.5807
Kapladığı Yer: 8 byte
NCHAR:
Açıklama: Char veri tipinin unicode karakterileri de kaplayan hali.
Nchar(n) olarak tanıtılır. N maksimum 4000 olabilir.
Kapladığı Yer: Değişken (Aynı uzunluktaki char veritipinin 2 katı)
NTEXT:
Açıklama: Text veri tipinin unicode karakteri de kapsayan hali.
Kapladığı Yer: Değişken (Aynı uzunluktaki text’in 2 katı)
NUMERIC:
Açıklama: (bkz: Decimal)
Kapladığı Yer: Değişken
NVARCHAR:
Açıklama: Varchar veri tipinin unicode karakterleride kapsayan hali.
Kapladığı Yer: Değişken (Aynı uzunluktaki varchar’ın 2 katı)
REAL:
Açıklama: Real sayı girilebilen veri tipi.
Minimum Değeri: -3.40E + 38
Maksimum Değeri: 3.40E + 38
Kapladığı Yer: 4 byte
SMALLDATETIME:
Açıklama: Datetime veri tipinin daha dar bir tarih aralığına sahiphali
Minimum Değeri: 1 Ocak 1900
Maksimum Değeri: 6 Haziran 2079
Kapladığı Yer: 4 byte
SMALLINT:
Açıklama: Int veri tipinin daha dar bir numerik aralığa sahip hali
Minimum Değeri: -32,768
Maksimum Değeri: 32,767
Kapladığı Yer: 2 byte
SMALLMONEY:
Açıklama: Money veri tipinin daha dar bir nümerik aralığa sahip hali
Minimum Değeri: -214,748.3648
Maksimum Değeri: -214,748.3647
Kapladığı Yer: Değişken
SQL VARIANT:
Açıklama: text,ntext,sql variant ve timestamp veri tipi hariç diğer veri
tiplerini barındırabilen veri tipi
Kapladığı Yer: Değişken
TEXT:
Açıklama: Maksimum 2,147,483,647 karakteri barındırabilen veri tipi.
“Text in Row” ve “Text Pointer” olarak iki çeşit kullanımı vardır.
Kapladığı Yer: Değişken
TIMESTAMP:
Açıklama: Bütün database objeleri arasında başka bir eşi olmayan sayı
üreten veri tipi. Satır her update edildiğinde değeri değişir.
Kapladığı Yer: 8 Byte
TINYINT:
Açıklama: Int veri tipinin daha dar bir nümerik aralığa sahip hali.
Sadecepozitif sayılar alabilir.
Minimum Değeri: 0
Maksimum Değeri: 255
Kapladığı Yer: 1 Byte
UNIQUEIDENTIFIER:
Açıklama: Eşi olmayan rakam ve yazılardan oluşan bir değer döndüren
veri tipi. Newid() fonksiyonuyla kullanılabilir.
Kapladığı Alan: 16 byte
VARBINARY:
Açıklama: Binary veri tipinin değişken uzunlukta veri tanımlanabileceği
hali.
Kapladığı Alan: Değişken
VARCHAR:
Açıklama: Char vertipinin değişken uzunlukta veri tanımlanabileceği hali.
Kapladığı Alan: Değişken
Bu altaki hatanın nedi mvc version uyuşmazlığından kaynaklı. Yukarıdaki zipli dosyayı indirirseniz gerekli donusumleri yapıp
hatayı ortadan kaldırabilirsiniz..
<add assembly=”System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35″ />
Son Yorumlar